PHP運行神器--用HHVM減少你一半的服務器

Hiphop是Facebook開發一款PHP二進制化的一個工具,最開始是由php轉爲C++,但是後來發現編譯爲c++的話,許多的時間會花費在編譯代碼上面,調試不方便,對於代碼來說也不是即見即所得。

所以hiphop經歷了這麼幾個階段:

HPHPC=>HPHPI=>HHVM

HPHPC是靜態編譯,也就是把php轉爲c++

HPHPI是一個過渡產品,類似php zend虛擬機,性能還不如zend虛擬機,但是可以運行查看效果;

HHVM是在HPHPI基礎上,應用了JIT技術,性能已經接近了HPHPC,目前facebook打算慢慢拋棄HPHPC;

性能上HPHPC和HHVM比zend虛擬機+加速器要節約cpu在50%在300%間(官方提供),我實際應用中,一般節約CPU在100%-300%間左右,流量越大越明顯。

以上內容摘自http://saiyaren.iteye.com/blog/1888973


最近對這東西做了一些部署測試,確實發現很好,基本降低CPU佔用50%以上是沒有任何問題的。而且這東西已經在國內某大型電商網站線上使用了1年多了,相關開源愛好者也貢獻了一些bug修復補丁和模塊擴展。


目前國內外對這一神器的研究都比較少,主要的問題我分析了下有3個


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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章