最近比較PHP跟Python, Erlang的特性,發現PHP有很多人們不常用到的特性。用PHP CLI可以實現很多不錯的應用。比如做搜尋引擎的爬蟲, 長期啟動並執行計算指令碼, 完全可以取代其他語言來做伺服器的營運。這對於熟悉PHP的人來說如虎添翼。
為什麼PHP多進程很好? 網遊伺服器大部分都使用多線程而不是多進程的原因也在於進程比線程更加穩定。而且多線程適合現在多核伺服器的應用情境,更能發揮多核運算的能力。進程的維護可以用很多作業系統層級的工具。Message Queue解決了多大部分線程通訊問題。所以PHP多進程很適合做伺服器端的計算密集型的應用。
據一家越南IT公司介紹,他們成功的把PHP後台多進程用在法律檔案的分發、處理銀行賬戶的金額這樣的企業級的應用上。
使用後台PHP進程可以不影響伺服器同時處理網頁的請求。這種後台進程一旦發生失敗很容易查處原因進行恢複或者補救,所以健壯性更高。不同的進程相互隔離,更加高效,可以統一調度各個服務進程。
PHP是目前應用最廣泛的Web開發語言,所以用PHP來做伺服器端的應用可以降低成本。可以用現有人員、現有配置、甚至做到代碼重用。什麼樣的情境更適合用PHP後台多進程呢?比如郵件的分發、遠程服務的調用、資料的彙總、計劃任務、計算結果的緩衝這些不需要立即返回的地方。
PHP單進程在某些地方完全可以達到目的,而且更加容易實現,不用考慮進程的同步問題,不用考慮資料的共用問題。PHP CLI(SAPI SERVER API) 命令列介面可以用來做CRON計劃任務, 圖形介面程式 (使用GTK庫)。
PHP CLI例子
php -f test.php php -r “echo time();” php -R as python style
PHP讀取命令列參數:
PHP命令列介面標準輸入輸出:
CRONJOB可以定時運行某些任務,但要防止重複運行。開始時建立一個鎖檔案, 結束時刪除。或者用ps命令來處理。任務隊列可以用MySQL來實現,或者Key/VALUE資料庫,或者訊息佇列來實現。
進程式控制制相關函數:
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多進程應用的容錯性?
◆可以監控進程,依賴進程失敗後報告。
◆用CRONJOB實現監控進程。
◆將被監控進程PID寫成檔案。
◆定時檢查PID檔案是否存在 檢查ps -o pid=或者file_exists(‘/proc/’)。
◆如果線程不存在重啟進程。
回顧以前用Java或者Python做的伺服器端的服務都可以用PHP來實現。單一語言更容易維護。以往人們對於Web語言的認識很片面,例如多線程、事 務這些東西都可以改變方式來達到同樣的目的。