Hiphop是Facebook开发一款PHP二进制化的一个工具,最开始是由php转为C++,可是后来发现编译为c++的话,许多的时间会花费在编译代码上面,调试不方便,对于代码来讲也不是即见即所得。php 因此hiphop经历了这么几个阶段:python HPHPC=>HPHPI=>HHVMmysql HPHPC是静态编译,也就是把php转为c++linux HPHPI是一个过渡产品,相似php zend虚拟机,性能还不如zend虚拟机,可是能够运行查看效果;ios HHVM是在HPHPI基础上,应用了JIT技术,性能已经接近了HPHPC,目前facebook打算慢慢抛弃HPHPC;nginx 性能上HPHPC和HHVM比zend虚拟机+加速器要节约cpu在50%在300%间(官方提供),我实际应用中,通常节约CPU在100%-300%间左右,流量越大越明显。c++ |
以上内容摘自http://saiyaren.iteye.com/blog/1888973git
最近对这东西作了一些部署测试,确实发现很好,基本下降CPU占用50%以上是没有任何问题的。并且这东西已经在国内某大型电商网站线上使用了1年多了,相关开源爱好者也贡献了一些bug修复补丁和模块扩展。github
目前国内外对这一神器的研究都比较少,主要的问题我分析了下有3个golang
1.官方不够活跃,包括目前的版本还有一些bug,好比在HHVM1.0下的libevent内存泄露,到了HHVM2.1上还未获得解决。
2.目前对PHP第三方模块的支持较少,好比对MongoDB的扩展,对于Redis模块只提供了最基本的功能函数,高级的东西仍是须要在php代码层去实现。
3.社区不够活跃,这也是最主要的一个问题
在这里我把最近对这东西的一些简单的研究分享一下,对这玩意儿有兴趣的童鞋能够加群讨论:
HHVM学习研究 群号:271240899
目前最新的官方2.1版本还存在着内存泄露的问题,对redis的支持只是提供了最基本的功能(咱们须要使用redis,因此对这一块比较在乎,其它的扩展能够去查看官方支持列表:https://github.com/facebook/hiphop-php/tree/master/hphp/runtime/ext)
源码安装过于麻烦,想尝鲜的建议yum,官方的源码安装文档:https://github.com/facebook/hiphop-php/wiki/Building-and-installing-HHVM-on-CentOS-6.3
参照官方的安装方式,用官方提供的yum源进行安装,在http://saiyaren.iteye.com/博主的支持下修复了libevent的内存泄露问题
Step1:设置好yum源
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm wget -O /etc/yum.repos.d/hop5.repo http://www.hop5.in/yum/el6/hop5.repo yum clean all |
Step2:安装好基础环境包。。。比较多。。。
rpm -ivh ftp://rpmfind.net/linux/epel/beta/6/x86_64/libmcrypt-2.5.8-9.el6.x86_64.rpm rpm -ivh ftp://rpmfind.net/linux/epel/beta/6/x86_64/libmcrypt-devel-2.5.8-9.el6.x86_64.rpm yum install git svn cpp make autoconf automake libtool patch memcached gcc-c++ cmake wget boost-devel mysql-devel pcre-devel gd-devel libxml2-devel expat-devel libicu-devel bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel binutils-devel pam-devel elfutils-libelf-devel tbb-devel libdwarf-devel dbus-cxx-devel libunwind-devel php-mssql libtool 若是准备编译安装的话,装如下的包就可以搭建好编译环境,若是不像编译安装则略过 yum install -y boost.x86_64 \ boost-chrono.x86_64 \ boost-date-time.x86_64 \ boost-devel.x86_64 \ boost-filesystem.x86_64 \ boost-graph.x86_64 \ boost-graph-mpich2.x86_64 \ boost-graph-openmpi.x86_64 \ boost-iostreams.x86_64 \ boost-jam.x86_64 \ boost-locale.x86_64 \ boost-math.x86_64 \ boost-mpich2.x86_64 \ boost-mpich2-devel.x86_64 \ boost-mpich2-python.x86_64 \ boost-openmpi.x86_64 \ boost-openmpi-devel.x86_64 \ boost-openmpi-python.x86_64 \ boost-program-options.x86_64 \ boost-python.x86_64 \ boost-random.x86_64 \ boost-regex.x86_64 \ boost-serialization.x86_64 \ boost-signals.x86_64 \ boost-static.x86_64 \ boost-system.x86_64 \ boost-test.x86_64 \ boost-thread.x86_64 \ boost-timer.x86_64 \ boost-wave.x86_64 \ cpp.x86_64 \ curl.x86_64 \ gcc.x86_64 \ gcc-c++.x86_64 \ gcc-gfortran.x86_64 \ gcc-objc.x86_64 \ gcc-objc++.x86_64 \ gcc-plugin-devel.x86_64 \ glog.x86_64 \ glog-devel.x86_64 \ gmp.x86_64 \ gmp-devel.x86_64 \ gmp-static.x86_64 \ golang.x86_64 \ libcurl.x86_64 \ libcurl-devel.x86_64 \ libdwarf.x86_64 \ libdwarf-devel.x86_64 \ libdwarf-static.x86_64 \ libdwarf-tools.x86_64 \ libevent.x86_64 \ libevent-devel.x86_64 \ libgcc.x86_64 \ libgfortran.x86_64 \ libgfortran-static.x86_64 \ libgomp.x86_64 \ libmemcached.x86_64 \ libmemcached-devel.x86_64 \ libmpc.x86_64 \ libmpc-devel.x86_64 \ libmudflap.x86_64 \ libmudflap-devel.x86_64 \ libmudflap-static.x86_64 \ libobjc.x86_64 \ libquadmath.x86_64 \ libquadmath-devel.x86_64 \ libquadmath-static.x86_64 \ libstdc++.x86_64 \ libstdc++-devel.x86_64 \ libstdc++-static.x86_64 \ libtool.x86_64 \ libtool-ltdl.x86_64 \ libtool-ltdl-devel.x86_64 \ lxc.x86_64 \ lxc-devel.x86_64 \ lxc-doc.x86_64 \ lxc-libs.x86_64 \ lxc-templates.x86_64 \ mpfr.x86_64 \ mpfr-devel.x86_64 \ nginx.x86_64 \ tbb.x86_64 \ tbb-devel.x86_64 \ tbb-doc.x86_64 \ 若是这里安装 golang 包报错能够选择不安装这个包 若是不是编译安装,只要执行 yum install hiphop-php |
Step3:解决HHVM对于libevent的内存泄露问题
git下libevent和hhvm的源码包,之因此要hhvm的源码包,是要在libevent源码中打入hhvm提供的针对libevent的补丁,才能让libevent支持hhvm git clone git://github.com/libevent/libevent.git git clone git://github.com/facebook/hiphop-php.git cd libevent/ git checkout release-1.4.14b-stable 打补丁 cat ../hiphop-php/hphp/third_party/libevent-1.4.14.fb-changes.diff | patch -p1 打完补丁后改修一下libevent的http.c文件,解决内存泄露的关键 大概在2319行这里,在 if (req->evcon->state == EVCON_DISCONNECTED) { 下面,增长 req->userdone = 1; |
Step4.编译安装libevent
./autogen.sh ./configure --prefix=/usr/ --libdir=/usr/lib64/ #注意路径不要出错,这里是覆盖了rpm安装的libevent make && make install |
ok...安装完毕
至此,
运行php脚本直接执行hhvm script.php就好了
hhvm会把php先编译成c++的代码再去运行
也能够使用hhvm以虚拟机的方式运行,这时候就至关于tomcat同样,配置文件能够指定监听一个端口,还有php网页文件存放的位置,会对指定位置下的php进行实时的编译,而后用nginx反向代理到这个端口就好了
运行方式:
hhvm -m daemon -c /etc/hhvm.hdf
关于hhvm.hdf配置文件能够参照官方文档的说明:
https://github.com/facebook/hiphop-php/wiki/Runtime-options
第三方扩展:
https://github.com/facebook/hiphop-php/wiki/HHVM-other-extension-share