背景
有一個php的CGI,在處理請求時,需要到其它10臺左右的伺服器上拉取資料(方式一樣,只是伺服器IP不同),進行展示。如果使用序列執行,由於網路延時,必然導致每一次http響應事件較長,經實踐證明,需要7~10秒左右的時間,使用者體驗很差。所以,如果能夠採用並行,應該會大大減少響應時間。在網上查詢相關資料,決定採用php提供的pcntl_fork + 管道的方式實現並行資料拉取與同步。經實踐證明,改成並行後,只需要不到2秒的時間,就可以完成所有資料的拉取,但是卻無法將這些資料返回給瀏覽器(用了等於白用L)。
原因
PHP的多程式函式(pcntl_*系列函式)通過apache執行,其結果很詭異,竟然將標準輸出(瀏覽器)給到fork出的子程式,導致主程式無任何輸出,瀏覽器無法接收來自主程式的資料。尋找相關資料,發現php手冊上有如下解釋:
Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination. Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
我的神呀,原來手冊上已經寫得這麼清楚了
P.S.:上面這句話在pnctl手冊首頁第一段,總結一個教訓,技術手冊不一定要全部看完,但是首頁還是得多留意一下,一般都會將重要的資訊放在這裡,這些資訊對是否使用該技術有很大參考價值
參考資料