服務(wù)器端PHP多進程編程實戰(zhàn)
最近比較PHP跟Python, Erlang的特性,發(fā)現(xiàn)PHP有很多人們不常用到的特性。用PHP CLI可以實現(xiàn)很多不錯的應(yīng)用。比如做搜索引擎的爬蟲, 長期運行的計算腳本, 完全可以取代其他語言來做服務(wù)器的運維。這對于熟悉PHP的人來說如虎添翼。
51CTO推薦閱讀:讓PHP開發(fā)者事半功倍的十大技巧
為什么PHP多進程很好? 網(wǎng)游服務(wù)器大部分都使用多線程而不是多進程的原因也在于進程比線程更加穩(wěn)定。而且多線程適合現(xiàn)在多核服務(wù)器的應(yīng)用場景,更能發(fā)揮多核運算的能力。進程的維護可以用很多操作系統(tǒng)級別的工具。Message Queue解決了多大部分線程通信問題。所以PHP多進程很適合做服務(wù)器端的計算密集型的應(yīng)用。
據(jù)一家越南IT公司介紹,他們成功的把PHP后臺多進程用在法律文件的分發(fā)、處理銀行賬戶的金額這樣的企業(yè)級的應(yīng)用上。
使用后臺PHP進程可以不影響服務(wù)器同時處理網(wǎng)頁的請求。這種后臺進程一旦發(fā)生失敗很容易查處原因進行恢復(fù)或者補救,所以健壯性更高。不同的進程相互隔離,更加高效,可以統(tǒng)一調(diào)度各個服務(wù)進程。
PHP是目前應(yīng)用最廣泛的Web開發(fā)語言,所以用PHP來做服務(wù)器端的應(yīng)用可以降低成本??梢杂矛F(xiàn)有人員、現(xiàn)有配置、甚至做到代碼重用。什么樣的場景更適合用PHP后臺多進程呢?比如郵件的分發(fā)、遠(yuǎn)程服務(wù)的調(diào)用、數(shù)據(jù)的聚合、計劃任務(wù)、計算結(jié)果的緩存這些不需要立即返回的地方。
PHP單進程在某些地方完全可以達到目的,而且更加容易實現(xiàn),不用考慮進程的同步問題,不用考慮數(shù)據(jù)的共享問題。PHP CLI(SAPI SERVER API) 命令行接口可以用來做CRON計劃任務(wù), 圖形界面程序 (使用GTK庫)。
PHP CLI例子
- php -f test.php
 - php -r “echo time();”
 - php -R as python style
 
PHP讀取命令行參數(shù):
- <?php
 - #!/usr/bin/php -q
 - echo “Test Arguments:\n”;
 - echo $_SERVER["argc"].”\n”;
 - echo $_SERVER["argv"][0].”\n”;
 - ?>
 
PHP命令行接口標(biāo)準(zhǔn)輸入輸出:
- <?php
 - #!/usr/bin/php -q
 - /* Define STDIN in case if it is not already defined by PHP for some reason */
 - if(!defined(“STDIN”)) {
 - define(“STDIN”, fopen(‘php://stdin’,'r’))
 - }
 - echo “Hello! What is your name (enter below):\n”;
 - $strName = fread(STDIN, 80); // Read up to 80 characters or a newline
 - echo ‘Hello ‘ , $strName , “\n”;
 - ?>
 
CRONJOB可以定時運行某些任務(wù),但要防止重復(fù)運行。開始時創(chuàng)建一個鎖文件, 結(jié)束時刪除?;蛘哂胮s命令來處理。任務(wù)隊列可以用MySQL來實現(xiàn),或者Key/VALUE數(shù)據(jù)庫,或者消息隊列來實現(xiàn)。
進程控制相關(guān)函數(shù):
- Process Control Extensions
 - pcntl_fork()
 - posix_setsid()
 - posix_kill
 - pcntl_wait
 - pcntl_signal
 - SIGHUP
 - SIGTERM; system shutdown, kill
 - SIGINT; sent by Ctrl+c
 - SIGKILL (uncatchable); unresponsive, kill -9
 - SIGCHLD; child status change
 - SIGSTP; sent by Ctrl+z
 - SIGCONT; resume from stop, fg
 
PHP不能對某些錯誤拋出異常,如何提高PHP多進程應(yīng)用的容錯性?
◆可以監(jiān)控進程,依賴進程失敗后報告。
◆用CRONJOB實現(xiàn)監(jiān)控進程。
◆將被監(jiān)控進程PID寫成文件。
◆定時檢查PID文件是否存在 檢查ps -o pid=或者file_exists(‘/proc/’)。
◆如果線程不存在重啟進程。
回顧以前用Java或者Python做的服務(wù)器端的服務(wù)都可以用PHP來實現(xiàn)。單一語言更容易維護。以往人們對于Web語言的認(rèn)識很片面,例如多線程、事 務(wù)這些東西都可以改變方式來達到同樣的目的。
原文鏈接:http://blog.eood.cn/server-side-php-progress-program-best-practice
【編輯推薦】















 
 
 




 
 
 
 