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