【教訓】phppcntl_fork無法在web伺服器環境下使用

吞吞吐吐的發表於2017-10-11

背景

有一個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手冊首頁第一段,總結一個教訓,技術手冊不一定要全部看完,但是首頁還是得多留意一下,一般都會將重要的資訊放在這裡,這些資訊對是否使用該技術有很大參考價值

參考資料

宣告:如有轉載本博文章,請註明出處。您的支援是我的動力!文章部分內容來自網際網路,本人不負任何法律責任。
本文轉自bourneli部落格園部落格,原文連結:http://www.cnblogs.com/bourneli/archive/2012/07/06/2579804.html,如需轉載請自行聯絡原作者


相關文章