高效能網站,HipHop php使用說明

來源:互聯網
上載者:User

這裡的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++可讀性很好。
最後,願上帝保佑你安裝成功。

本文出自 “實踐檢驗真理” 部落格,轉載請與作者聯絡!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.