最近比較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
- #!/usr/bin/php -q
- echo “Test Arguments: ”;
- echo $_SERVER["argc"].” ”;
- echo $_SERVER["argv"][0].” ”;
- ?>
PHP命令行接口標准輸入輸出:
- <?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): ”;
- $strName = fread(STDIN, 80); // Read up to 80 characters or a newline
- echo ‘Hello ‘ , $strName , “ ”;
- ?>
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語言的認識很片面,例如多線程、事 務這些東西都可以改變方式來達到同樣的目的。