這裡的HipHop,不是嘻哈樂,我不喜歡嘻哈。
HipHop是Facebook開源的php編譯器,可以將php轉換成C++再編譯成可執行檔案,用以提高php的執行效率。
安裝過程比較複雜,依賴的東西很多。Boost,Onigumura,tbb,icu,mysql,flex,re2c等等,還有facebook補丁版的libevent和curl。
其實facebook開源兩大網站利器,hiphop和scribe,按照科學的哲學思想,都屬於偽科學,比較難安裝和編譯,安裝編譯過程基本不可重現,給人感覺是在使用者在不修改原始碼的情況下能裝上都屬於蒙的。So you know that
所以,對於沒有經驗的使用者,按照官方指引,也只能說有一定機率可以裝上。
因此,就不用把安裝過程復現出來了,即使我寫出來,按照步驟也不一定能裝的上。Facebook官方有在ubuntu和centos下的安裝指南。還是很詳細的,感興趣的可以參照官方的安裝指南嘗試一下。不過官方指南里面少了一個安裝libunwind庫。
先寫一段程式測試一下hiphop編譯後的php效能
<?php
function BubbleSort($str)
{
                for ($i=0;$i<count($str);$i++)
                {
                                for ($j=count($str)-2;$j>=$i;$j–)
                                {
                                                if($str[$j+1]<$str[$j])
                                                {            
                                                                $tmp = $str[$j+1];
                                                                $str[$j+1]=$str[$j];
                                                                $str[$j]=$tmp;
                                                }
                                }
                }
                return $str;
}

for($i = 0;$i < 10000;$i++)
{
                $str[$i] = rand(0,20000);
}
BubbleSort($str);
echo “finished”;
?>

生成10000個0-20000之間的隨機數,然後氣泡排序。因為冒泡的效率比較低,可以比較直觀的看出編譯前和編譯後的執行效率差別。
用hiphop編譯
[root@localhost scribe]# hphp –keep-tempdir=1 –log=3 random.php    
running hphp…
creating temporary directory /tmp/hphp_4DOImV …
parsing inputs…
parsing ./random.php…
parsing inputs took 0`00″ (2 ms) wall time
pre-optimizing…
pre-optimizing took 0`00″ (0 ms) wall time
inferring types…
inferring types took 0`00″ (0 ms) wall time
post-optimizing…
post-optimizing took 0`00″ (0 ms) wall time
creating CPP files…
creating CPP files took 0`00″ (35 ms) wall time
compiling and linking CPP files…

compiling and linking CPP files took 0`35″ (35732 ms) wall time
running executable /tmp/hphp_4DOImV/program –file random.php…
finishedall files saved in /tmp/hphp_4DOImV …
running hphp took 0`42″ (42126 ms) wall time

–keep-tempdir=1的意思是生成C++程式碼並編譯後,臨時目錄不刪除。–log=3是控制檯輸出日誌的等級,4是最詳細的notice都輸出。最大就到4。
編譯完成,路徑在/tmp/hphp_4DOImV。
先不著急看生成檔案,先看看原本php的執行效率如何,執行3次,估算一下平均時間。
[root@localhost scribe]# time php random.php
finished
real        0m14.776s
user        0m14.737s
sys         0m0.024s
[root@localhost scribe]# time php random.php
finished
real        0m14.801s
user        0m14.744s
sys         0m0.047s
[root@localhost scribe]# time php random.php
finished
real        0m14.787s
user        0m14.734s
sys         0m0.037s

然後到/tmp/hphp_4DOImV下
[root@localhost hphp_4DOImV]# ls
CMakeCache.txt    CMakeFiles    cmake_install.cmake    CMakeLists.txt    Makefile    php    program    sys
[root@localhost hphp_4DOImV]# time ./program
finished
real        0m6.562s
user        0m6.471s
sys         0m0.068s
[root@localhost hphp_4DOImV]# time ./program
finished
real        0m6.100s
user        0m6.067s
sys         0m0.012s
[root@localhost hphp_4DOImV]# time ./program
finished
real        0m6.107s
user        0m6.060s
sys         0m0.027s

Wow,看起來非常不錯,從大約15秒的執行時間,編譯後大約在6秒左右。效能提升還是非常可觀的。對於一些壓力大的網站,還是非常合適的。
然後看下怎麼在web環境下使用。hiphop是這樣,編譯完成之後,可執行檔案本身就自帶了一個webserver,所以,我們只需要讓可執行檔案當成一個webserver啟動就可以了,然後用nginx做反代,nginx反代就不說怎麼配置了。就說啟動hiphop編譯後的程式就行了。我們先看看這個可執行檔案提供什麼選項。
[root@localhost hphp_4DOImV]# ./program –help
Usage:

                ./program [-m <mode>] [<options>] [<arg1>] [<arg2>] …

Options:
    –help                                                    display this message
    -m [ –mode ] arg (=run)                run | server | daemon | replay | translate
    -c [ –config ] arg                         load specified config file
    -v [ –config-value ] arg             individual configuration string in a format
                                                                    of name=value, where name can be any valid
                                                                    configuration for a config file
    -p [ –port ] arg (=-1)                 start an HTTP server at specified port
    –admin-port arg (=-1)                    start admin listerner at specified port
    -u [ –user ] arg                             run server under this user account
    -f [ –file ] arg                             executing specified file
    –count arg (=1)                                how many times to repeat execution
    –no-safe-access-check arg (=0) whether to ignore safe file access check
    –arg arg                                             arguments
    –extra-header arg                            extra-header to add to log lines
    –build-id arg                                    unique identifier of compiled server code

這裡面,-m選項和-p選項就是我們啟動web服務需要用的。
作為除錯,我們可以這樣。
[root@localhost hphp_4DOImV]# ./program -m server -p 8080
loading static content…
loading static content took 0`00″ (0 ms) wall time
page server started
admin server started
all servers started

然後我們用curl訪問一下看看,注意,你編譯前php叫什麼名字,編譯後執行在webserver裡面還叫什麼。
[root@localhost ~]# curl -i http://localhost:8080/random.php
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Mon, 13 Aug 2012 10:39:09 GMT
Content-Length: 8

finished

在生產環境,可以把-m server選項替換為-m daemon,就啟動後臺程式了。
然後把你的nginx反代到8080埠,就可以正常在web環境下訪問了。
有幾個注意事項,網上文章裡面基本沒有提及。
1. hiphop編譯後,可以把可執行檔案抓下來,單獨扔到與編譯機作業系統相同的環境下執行。但是,執行環境需要配置安裝hiphop時所需要的相同的boost, re2c, oniguruma, mysql, gd等等動態連線庫。
2. eval函式不能用。socket相關函式,abstract,interface等,可能帶來轉換的Segmentation Fault錯誤,導致無法轉換編譯,不過是可能,不是必然。
3. 整站php編譯後也都在一個可執行檔案中。執行daemon後,你原來怎麼訪問,現在還是怎麼訪問,檔名,連線都不變。
4. 任何include或者require,不能用相對連線,必須用作業系統的絕對連線。否則會提示找不到檔案。
5. 不要嘗試編譯phpinfo(),你什麼都得不到。
6. 生成的C++可讀性很好。
最後,願上帝保佑你安裝成功。