這裡的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++可讀性很好。
最後,願上帝保佑你安裝成功。
本文出自 “實踐檢驗真理” 部落格,轉載請與作者聯絡!