2008年Facebook就开始使用HipHop(现在成为HPHP),这是一种PHP执行引擎;最初是为了将Fackbook的大量PHP代码转成C++,以提高性能和节约资源。最初的版本成为HPHPc,是一个PHP到C++的编译器。 之后的两年里,Fackbook又向HipHop中增加了HPHPi和HPHPd,HPHPi其实就是开发版的HPHP,HPHPd则是HipHop的调试器。通过HPHPd开发人员可以单步调试运行在HipHop平台上的PHP代码。 使用HipHop的PHP代码在性能上最大可以是原生的6倍。但是,第一版的HipHop有不少确定,具体如下: HPHPc无法完全支持PHP的所有特性,最典型的是无法支持create_function()和eval()两个函数。但老实说,不支持后一个函数我不觉得是件坏事。 Facebook的开发者不得不维护两种不同的引擎(HPHPc和HPHPi),这直接导致了重复劳动和资源浪费。 最后,HPHPc部署步骤繁杂,这点很让PHP开发者头疼。. 在2010年初,Fackbook因为这些问题做出了2个重大的决定。首先是将HipHop平台开源,通过这种方式来加快HipHop的发展。 其次,Facebook开始开发HipHop的更高版本,也就是HHVM(HipHop虚拟机),HHVM加强了HPHPc的健壮性,同时还修复了许多重要错误。 HHVM是在HPHPc的基础上构建,它会将PHP代码转换成高级别的字节码(一种中间语言),在运行时即时(JIT)编译器会将这些字节码翻译成机器码。 下面是一些关于字节码、机器码和即时(JIT)编译器的概念,快速的浏览以下概念,可以清楚这些概念在HHVM所处的角色。
通过以上技术,HipHop和HHVM获得了性能的提升。 安装步骤: 1. 利用《lnmp一键安装包》安装Nginx和MySQL(也可以选择安装php,hhvm可以和php同时运行) yum -y install wget screen # for CentOS/Redhat #apt-get -y install wget screen # for Debian/Ubuntu wget http://blog.linuxeye.com/lnmp.tar.gz #wget http://blog.linuxeye.com/lnmp-full.tar.gz # 包含源码(官方下载太慢) tar xzf lnmp.tar.gz cd lnmp #如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件 screen -S lnmp # 如果网路出现中断,可以执行命令`screen -r lnmp`重新连接安装窗口 ./install.sh如下图: 2. 安装hhvm(CentOS 6 64bit) rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm cd /etc/yum.repos.d wget http://www.hop5.in/yum/el6/hop5.repo yum clean all yum -y remove libevent-devel libevent yum -y install hhvm --setopt=protected_multilib=false 3. 配置 修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下: location ~ .*\.(php|php5)?$ { fastcgi_pass unix:/var/run/hhvm/sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } service nginx reload下载支持hhvm方式添加虚拟主机脚本 vhost_hhvm.sh cd lnmp wget http://blog.linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh chmod +x vhost_hhvm.sh配置hhvm修改/etc/hhvm/config.hdf,保持如下: PidFile = /var/run/hhvm/pid ResourceLimit { CoreFileSize = 0 # in bytes MaxSocket = 10000 # must be not 0, otherwise HHVM will not start SocketDefaultTimeout = 5 # in seconds MaxRSS = 0 MaxRSSPollingCycle = 0 # in seconds, how often to check max memory DropCacheCycle = 0 # in seconds, how often to drop disk cache } Log { Level = Info AlwaysLogUnhandledExceptions = true RuntimeErrorReportingLevel = 8191 UseLogFile = true UseSyslog = false File = /var/log/hhvm/error.log Access { * { File = /var/log/hhvm/access.log Format = %h %l %u % t \"%r\" %>s %b } } } MySQL { ReadOnly = false ConnectTimeout = 1000 # in ms ReadTimeout = 1000 # in ms SlowQueryThreshold = 1000 # in ms, log slow queries as errors KillOnTimeout = false } Mail { SendmailPath = /usr/sbin/sendmail -t -i ForceExtraParameters = }配置以www运行hhvm: mkdir /home/www chown www.www /home/www修改/etc/hhvm/php.ini指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/mysql.sock) hhvm.mysql.socket = /tmp/mysql.sock expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样) memory_limit = 400M post_max_size = 50M默认hhvm不提供php中类似disable_functions参数,如何禁用hhvm中shell_exec函数?(可选) 在/etc/hhvm/php.ini中追加如下: hhvm.jit_enable_rename_function=true auto_prepend_file= /home/wwwroot/default/disable_functions新建/home/wwwroot/default/disable_functions,使该文件内容如下: <?php function __forbidden_function($name, $obj, $args, $data, &$done) { throw new Exception('Calling '.$name.' is forbidden.'); } fb_intercept('shell_exec', '__forbidden_function');配置service管理hhvm: cd /etc/init.d/ rm -rf hhvm wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm chmod +x hhvm chkconfig hhvm on service hhvm restart添加虚拟主机: vhost_hhvm.sh #和lnmp添加虚拟主机一样测试wordpress完美运行,且速度非常快;discuz后台正常,前台页面显示有问题,兼容性有待完善! 出现一个问题,运行1天左右hhvm进程会自动宕掉(直接报502),可暂时加入crontab(后面找到解决方法再更新): */4 * * * * [ -z "`ps -ef | grep hhvm | grep -v grep`" ] && /sbin/service hhvm restart | tee -a /home/wwwlogs/hhvmrestart.log 参考:https://github.com/facebook/hhvm 原文:http://blog.linuxeye.com/396.html 转载请保留固定链接: https://linuxeye.com/Linux/hhvm-nginx.html |