標籤:

PHP執行時間長導致PHP-FPM不響應其他請求?

我想求教一個問題,我的一個PHP文件需要執行十幾分鐘,用的是Nginx+PHP-FPM,然後每次這個文件一執行,只要還沒返回結果,整個PHP-FPM就都不響應請求,導致所有其他的PHP頁面都無法打開,這是什麼原因導致的呢?有沒有除了用Apache代替以外的其他辦法解決?


需要執行十幾分鐘的PHP腳本就不要在PHP-FPM里跑了,建議運行在PHP-FPM中的PHP腳本用pclose(popen())無阻塞打開一個PHP-CLI進程執行你的腳本.執行完成後把消息插入資料庫.前台通過AJAX定時輪詢進行消息通知(類似知乎的消息通知一樣).

如果你一定要在PHP-FPM中跑這種耗時很長的腳本也不是不可以.首先你需要配置Nginx把這個腳本轉發給一個預先配置好的獨立的PHP-FPM動態進程池(不同的PHP-FPM進程池監聽不同的埠)來處理,這樣該腳本的執行不會影響到其他PHP-FPM進程池.而且動態進程池(pm = dynamic)能夠動態fork出更多的進程來處理腳本,代價就是內存消耗多點,這時你最好配置一個最大進程數(pm.max_children = 20).如果你想讓PHP-FPM結束HTTP請求後繼續處理業務,可以用fastcgi_finish_request()這個PHP-FPM提供的函數.


這種玩意 不是應該用 非同步操作去執行嗎……

然後 用 php腳本的方式執行,而不是 一個http請求的方式執行……


fpm有配置參數,一個fpm同時刻只能處理一個請求,但可以根據參數靜態或者動態啟動多個fpm進程,以實現並發連接的目的。

然而即使這樣,進程級的io復用限制了並發數量,除非從http server開始就能很好地實現輕量化的非同步調用,否則並發數量很正常地上不去。據聞一個fpm進程少說吃3-5MB內存,加之CPU消耗,採用fpm單台伺服器達到個千量級的並發就很不錯了。


nginx要配置下,否則會超時


需要執行十幾分鐘的的PHP腳本,採用非同步處理


是不是開了session ,php是有session鎖的 ,長時間的請求,一定要session_write_close(); 釋放session


嗯fpm有設置的,可以改worker進程數量,不過終究不是個辦法,建議還是打到消息隊列里,另起消費者節點慢慢消化吧,IO密集的考慮下多線程什麼的優化一下,CPU密集的如果打滿CPU就沒辦法了,可以考慮優化演算法或者加機器硬扛...


推薦閱讀:

nginx配置https
Nginx基本配置備忘
淺談前端線上部署與運維
nginx快速入門之基本原理篇
如何 windows下nginx+django+flup python3?

TAG:PHP | Nginx | php-fpm |