分类: 系统运维
2015-10-21 09:20:29
HipHop VM(HHVM)是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点。
Facebook表示,HHVM将替代HPHPi,用于所有的PHP执行。根据 Facebook透漏,HHVM在速度方面获得了显著改进,比目前使用的PHP解释器快60%,而使用内存减少90%。Facebook于12年十二月初发布了一个博文,宣布他们的解释型PHP运行环境HHVM(HipHop VM)已经达到甚至超过了编译型PHP运行环境HipHop的运行速度
二、安装
1,安装epel源:yum install http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
2,配置源:
cd /etc/yum.repos.d
wget
yum makecache
3,升级gcc到4.8.2: yum install gcc.x86_64
4,安装HHVM2.4 : yum install hhvm.x86_64
三、编写配置文件
vi /etc/hhvm.hdf
Server {
Port = 90
Type=fastcgi #fastcgi支持
SourceRoot = /home/www/
}
Eval {
Jit = true #启用Jit动态编译
JitWarmupRequests=0 #第一次请求即开启Jit,默认是11
}
Log {
Level = Error
UseLogFile = true
File = /var/log/hhvm/error.log
Access {
* {
File = /var/log/hhvm/access.log
Format = %h %l %u %t \"%r\" %>s %b
}
}
}
VirtualHost {
* {
Pattern = .*
RewriteRules {
dirindex {
pattern = ^/(.*)/$
to = $1/index.php
qsa = true
}
}
}
}
StaticFile {
FilesMatch {
* {
pattern = .*\.(dll|exe)
headers {
* = Content-Disposition: attachment
}
}
}
Extensions {
css = text/css
gif = image/gif
html = text/html
jpe = image/jpeg
jpeg = image/jpeg
jpg = image/jpeg
png = image/png
tif = image/tiff
tiff = image/tiff
txt = text/plain
}
}
四、启动HHVM服务
hhvm --mode daemon --user root --config /etc/hhvm.hdf
--mode daemon:后台进程方式运行
--user root:以root用户运行
--config :启动的配置文件
CLI: time hhvm -v"Eval.Jit=true""Eval.JitWarmupRequests=0" -f test_cpu.php
五、与nginx结合,使用nginx做反向代理,将请求转给hhvm
在nginx里创建虚拟机:
}
此时通过8000端口访问php文件,头信息如下:
全部成功!
HHVM(HipHop Virtual Machine)会将PHP代码转换成高级别的字节码(通常称为中间语言)。然后在运行时通过即时(JIT)编译器将这些字节码转换为x64的机器码。在这些方面,HHVM十分类似与C#的CLR和Java的JVM。
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获得了性能的提升。
《CentOS 7下hhvm Nginx环境搭建》,下面是在CentOS6下安装教程
安装步骤:
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
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \ libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \ bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \ libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --version HipHop VM 3.4.0-dev+2014.09.29 (rel) Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905 Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dca Extension API: 20140829
3. 配置hhvm
删除安装hhvm时创建的nginx用户
userdel -r nginx
修改hhvm目录权限为www
chown -R www.www /var/run/hhvm chown -R www.www /var/log/hhvm
修改/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,保持如下:
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 = }
配置hhvm修改/etc/hhvm/server.ini,使内容保存如下:
; php options pid = /var/run/hhvm/pid ; hhvm specific ;hhvm.server.port = 9001 hhvm.server.file_socket = /var/run/hhvm/sock hhvm.server.type = fastcgi hhvm.server.default_document = index.php hhvm.log.use_log_file = true hhvm.log.file = /var/log/hhvm/error.log hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
修改/etc/hhvm/php.ini,使内容保存如下:
hhvm.mysql.socket = /tmp/mysql.sock ;指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/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 #官方默认脚本是以www运行,建议用我修改后的 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后台正常,前台页面显示有点问题
参考: