fastcgi_finish_request()是沖刷(flush)全部響應的數據給客戶端並結束請求。這使得客戶端結束鏈接後,須要大量時間運行的任務可以繼續運行。php
當PHP運行在FastCGI模式時,PHP FPM提供了一個名爲fastcgi_finish_request的方法.按照文檔上的說法,此方法能夠提升請求的處理速度,若是有些處理能夠在頁面生成完後再進行,就能夠使用這個方法.
聽起來可能有些茫然,咱們經過幾個例子來講明一下:瀏覽器
代碼以下 | 複製代碼 |
<?php echo '例子:'; fastcgi_finish_request(); /* 響應完成, 關閉鏈接 */ /* 記錄日誌 */ file_put_contents('log.txt', '生存仍是毀滅,這是個問題.'); ?> |
經過瀏覽器訪問此腳本, 結果發現並無輸出相應的字符串,但卻生成了相應的文件.由此說明在調用fastcgi_finish_request後,客戶端響應就已經結束,但與此同時服務端腳本卻繼續運行!
合理利用這個特性能夠大大提高用戶體驗,趁熱打鐵再來一個例子:spa
代碼以下 | 複製代碼 |
<?php echo '例子:'; file_put_contents('log.txt', date('Y-m-d H:i:s') . " 上傳視頻n", FILE_APPEND); fastcgi_finish_request(); sleep(1); file_put_contents('log.txt', date('Y-m-d H:i:s') . " 轉換格式n", FILE_APPEND); sleep(1); file_put_contents('log.txt', date('Y-m-d H:i:s') . " 提取圖片n", FILE_APPEND); ?> |
代碼裏用sleep模擬一些耗時的操做,瀏覽時沒有被堵塞,程序卻都執行了,具體看日誌.
末了給您提個醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把內容儘快發到客戶端去,它和本文介紹的fastcgi_finish_request有些許的相似.
另外, 從代碼的可移植性講的話, 能夠在代碼中附上以下代碼:.net
代碼以下 | 複製代碼 |
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { }} |