Install extension for macOS built-in PHP

macOS High Sierra 10.13.3 ships with PHP 7.1.7. I’m trying to install an extension for the built-in PHP. I tried the pecl command but no lucky because SIP (System Integrity Protection) protection. I can’t add file under the directory /usr/lib/php that default php extension directory. It’s a little difficult but I installed an extension success […]

php的libev扩展

pecl上新添了一个ev扩展,目前版本是0.2.0,已经stable。这个扩展为php提供了libev库的接口。 ev is a PECL extension providing inteface to libev library – high performance full-featured event loop written in C. ABOUT LIBEV Libev is an event loop: you register interest in certain events (such as a file descriptor being readable or a timeout occurring), and it will manage these event sources and provide your program […]

mac下快速安装php 5.4

手头的笔记本升级到了OS X 10.8了,但是偶尔还需要写点php调剂一下。看看自带的php版本? PHP 5.3.13 with Suhosin-Patch (cli) (built: Jun 20 2012 17:05:20) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies 对于追新族来说,必须得升级到php 5.4才开心。借助homebrew很快完成升级: 安装过程 三行即可。 brew tap homebrew/dupes brew tap josegonzalez/homebrew-php brew install php54 这样安装的php路径在/usr/local/bin/php,版本信息: /usr/local/bin/php -v PHP 5.4.4 (cli) (built: Jul 27 2012 08:42:32) Copyright (c) 1997-2012 The […]

关于php的libevent扩展的应用

php有个libevent扩展,在一年前我曾经拿它实现了一个thrift socket server,虽然我没有把它放在正式的场合来使用,但是我觉得这个扩展应该可以有更广泛的用途,比如: phpDaemon — 一个异步的服务器端开发框架. tail – 用php实现类似unix下的tail命令行 ZeroMQ + libevent in PHP – 用php和ZeroMQ实现的一个事件驱动服务器端 我所想到的一个比较实用的使用场景是,在页面中利用libevent请求多个http接口来获得数据。若是在从前,一个可行的办法是利用curl_multi_exec来同时请求好几个接口,但是这个办法需要用一个do … while循环来完成请求,很是坑爹。那么看看采用libevent的例子: 代码实例 http.php 为了省事,这个php脚本仅仅是重复抓取一个网页5次,并且回调的逻辑我没怎么做处理,仅仅是echo出来而已,可以通过下面命令行来运行这个例子: php http.php “www.baidu.com” 代码中的http_get($argv[1])这行虽然是靠一个命令行顺序执行,但是不会阻塞后面的代码,直接就进行下一次请求了。而且我们看看回调方法部分是不是很像用javascript调用ajax写的回调方法?这都是php 5.3中闭包的功劳。 event_set($event_fd, $fd, EV_WRITE | EV_PERSIST, function($fd, $events, $arg) { //回调方法,后续处理随意 echo fread($fd, 4096); if(feof($fd)) { fclose($fd); event_base_loopexit($arg[1]); echo “done”; } }, array($event_fd, $base_fd)); 想到更多 在mysqlnd,memcached…这些php扩展中,都已经有delay回调的实现,如果能好好利用,对性能提升岂不是有莫大的帮助?或者在libevent扩展的基础上,实现一个事件驱动的开发框架,也是可行的。 Update 2011.11.10 在这个代码的基础上实现了一个异步http请求的客户端 […]

php文档更新

php.net最近更新了php文档,比较有用的是新增的pman工具。pman是一个命令行小工具,方便查看php函数的本地帮助文档,但是不包含php.net的评论数据。简单的试用心得如下: 安装pman 使用传说中的pear来安装pman sudo pear install doc.php.net/pman 如果pear版本比较老,需要先升级pear才可以继续 sudo pear upgrade pear pman使用方法 pman的使用方法很傻瓜,比如我们想查看strlen的帮助信息: pman strlen 帮助文本的内容是彩色的,能和chm版本的php帮助文档媲美。pman的详细使用帮助如下 #pman –help man, version 1.6c usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list] [-m system] [-p string] name … a : find all matching entries c : do not use cat file d : print gobs […]

用git部署php站点

在小站点上,直接用git来部署php代码相当方便,你的远程站点以及本地版本库都有一个版本控制,追踪问题或者回滚是很轻松的事情。下面介绍用git部署时的设置步骤 在远程服务器的设置 假定你需要部署的代码在/var/www/yoursite cd /var/www/yoursite git init . git config receive.denyCurrentBranch ignore git config –bool receive.denyNonFastForwards false cd .git/hooks wget https://gist.githubusercontent.com/volca/9482044/raw/344a590af350b997db3819fa21426dfe8bc140f4/post-update chmod +x post-update 在本地git库中新增配置 [remote “prod”] url = your-ssh-username@your-host:/var/www/yoursite/ 这样就算设置完成了。 如果你想把本地的代码推送到远程服务器,下面简单的步骤就可以做到 git pull git push prod 注意事项 如果远程服务器上git的配置目录.git暴露在外部可访问的位置,请在web服务器上设置这个目录不可见。

防止伪造跨站请求的小招式

伪造跨站请求介绍 伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。这种攻击常见的表现形式有: 伪造链接,引诱用户点击,或是让用户在不知情的情况下访问 伪造表单,引诱用户提交。表单可以是隐藏的,用图片或链接的形式伪装。 比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。 yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。 随机串代码实现 咱们按照这个思路,山寨一个crumb的实现,代码如下:

php实现的thrift socket server

这些天用php写了个thrift的socket server,因为原来thrift的源码里php部分只有基于apache的服务器端代码,再加上前些日子看到php也能直接使用libevent构建web服务器,所以才会想到写这个玩玩。 php-thrift-server源码 代码直接从apache的thrift项目clone过来,托管在github上: http://github.com/volca/thrift 新增或改动的代码如下: lib/php/ `– src |– server | |– TNonblockingServer.php | `– TServer.php `– transport |– TNonblockingServerSocket.php |– TNonblockingSocket.php |– TServerSocket.php |– TServerTransport.php test/php |– TestClient.php |– TestNonblockingServer.php 使用示例 获取thrift的源码,并编译出thrift工具,编译过程请搜索 git clone git://github.com/volca/thrift.git 安装php,以及apc, libevent扩展: pecl install apc #需要先libevent-devel之类的包包 pecl install libevent 运行php的socket服务器,我直接从thrift的test代码中修改了一个独立运行的php server,见thrift/test/php/TestNonblockingServer.php,这里也包含一个测试业务代码的实现。 cd thrift/test/php #用thrift命令行工具生成php的测试类库 make #启动thrift服务,会监听本机的9090端口 php TestNonblockingServer.php […]

php的filter扩展小技巧

做为一个合格的web开发人员,一定会牢记一个原则——永远不能相信用户输入的数据,行走江湖,安全第一是很重要的。用户通过表单或url传过来的数据,一定要仔细检查过了,才往后台数据库里存进去。在一个成熟的开发团队里,贯彻这个原则不成问题;但是如果在一个新人老手混搭的小team里,很容易就忽视了这个问题,那么各种安全漏洞比如跨站攻击,sql注入等等真是防不胜防。 实际上,用php 5自带的filter扩展能够较好的解决这个问题。我在从前的blog里记录了filter扩展的常规用法——直接利用filter来校验数据,这样有不少额外的代码量,所以我得介绍一个比较偷懒的办法——自动对所有输入变量进行过滤,这只需要对php.ini增加一行配置,然后重启apache或fastcgi让php配置生效。 filter.default=”special_chars” 开启了这项配置后,会自动使用filter_input方法对$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER变量进行过滤转义。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的缩写,它能自动转义大部分危险字符例如: '"<>。而php手册对它的解释是: HTML-escape ‘”& and characters with ASCII value less than 32, optionally strip or encode other special characters. 在这个情况下,新人们写出这样的代码我也不会太担心: $foo = $_GET[‘foo’]; echo $foo; 在部分场合,我们可能还是需要未转义的变量,比如某个ajax接受的参数是一段json串,用这段代码即可获得原始数据: $foo = filter_input (INPUT_GET, ‘foo’, FILTER_UNSAFE_RAW); fitler扩展与yahoo使用的yiv如出一辙,印象里似乎就是yahoo对yiv做了些修改贡献给php社区,但是暂时没找到出处。