迁移到 HHVM

今天又没什么事干,正好折腾下 Facebook 的 HHVM。关于 HHVM 是如何提升 PHP 性能的,有篇文章写得不错,搜索下就能找到。

编译过程没什么坑,照官方 wiki 安装好依赖就行,默认是安装到 /usr/local/hhvm,如果不想安装到这里,可以在 cmake 的时候添加 -DCMAKE_INSTALL_PREFIX 参数,除此之外好像没什么有用的编译参数。make 的 -j 参数是给多核并行编译用的,后面几个数字代表同时编译的任务数,不带数字代表不限制,CPU 核心多可以不限制,不过大部分普通站长的 VPS 都是单核的,最好不要加。

HHVM 的 FastCGI 跟 PHP-FPM 的基本一致,如果是 nginx 改下 fastcgi_pass 就可以了。HHVM 还兼容 php.ini,所以运行参数也基本不用更改,不过要注意的是,当使用 open_basedir 时,HHVM 会报 RequestInitDocument Not Found 错误,原因没有查到。

hhvm.jit = true

hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.file = /data/log/php/hhvm.log
hhvm.log.header = true
hhvm.log.level = info
hhvm.log.max_messages_per_request = -1
hhvm.log.native_stack_trace = true
hhvm.log.no_silencer = true
hhvm.log.runtime_error_reporting_level = 22527
hhvm.log.use_log_file = true

hhvm.pid_file = /var/run/hhvm.pid

hhvm.repo.central.path = /data/tmp/.hhvm.hhbc

hhvm.server.file_socket = /tmp/hhvm.sock
hhvm.server.type = fastcgi

上面的参数在官方 wiki 中 Runtime options 都有提到,我也懒得写了。
hhvm.log.runtime_error_reporting_level 是用的 php.ini 的默认设置,E_ALL & ~E_DEPRECATED & ~E_STRICT32767 - 8192 - 2048 = 22527,对应的数值可以看这里(不要看中文文档,没更新)。
缓存文件默认在 ~/.hhvm.hhbc,使用 hhvm.repo.central.path 配置路径。
socket 文件的默认权限是 600,启动后记得改下,这里有个启动脚本。

对于我这种小网站,HHVM 的作用并不明显,测试了下,在不开缓存插件的情况下,打开 wordpress 首页快了大约 300ms。不过 HHVM 的稳定性有很大问题,HHVM 不支持 Zend Framework,当跑基于 Zend Framework 框架的网站时竟然整个进程都 crashed 了。所以在迁移前一定要仔细测试下 HHVM 是否支持当前程序 。