天天看點

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%間左右,流量越大越明顯。

最近對這東西做了一些部署測試,确實發現很好,基本降低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,如需轉載請自行聯系原作者