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%間左右,流量越大越明顯。
最近對這東西做了一些部署測試,确實發現很好,基本降低CPU占用50%以上是沒有任何問題的。而且這東西已經在國内某大型電商網站線上使用了1年多了,相關開源愛好者也貢獻了一些bug修複更新檔和子產品擴充。
目前國内外對這一神器的研究都比較少,主要的問題我分析了下有3個
1.官方不夠活躍,包括目前的版本還有一些bug,比如在HHVM1.0下的libevent記憶體洩露,到了HHVM2.1上還未得到解決。
2.目前對PHP第三方子產品的支援較少,比如對MongoDB的擴充,對于Redis子產品隻提供了最基本的功能函數,進階的東西還是需要在php代碼層去實作。
3.社群不夠活躍,這也是最主要的一個問題
在這裡我把最近對這東西的一些簡單的研究分享一下,對這玩意兒有興趣的童鞋可以加群讨論:
HHVM學習研究 群号:271240899
Step1:設定好yum源
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum clean all
Step2:安裝好基礎環境包。。。比較多。。。
rpm -ivh ftp://rpmfind.net/linux/epel/beta/6/x86_64/libmcrypt-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
本文轉自lustlost 51CTO部落格,原文連結:http://blog.51cto.com/lustlost/1285597,如需轉載請自行聯系原作者