當PHP運行在FastCGI模式時,PHP FPM提供了一個名爲fastcgi_finish_request的方法.按照文檔上的說法,此方法能夠提升請求的處理速度,若是有些處理能夠在頁面生成完後再進行,就能夠使用這個方法.php
聽起來可能有些茫然,咱們經過幾個例子來講明一下:html
<?php echo '例子:'; fastcgi_finish_request(); /* 響應完成, 關閉鏈接 */ /* 記錄日誌 */ file_put_contents('log.txt', '生存仍是毀滅,這是個問題.'); ?>
經過瀏覽器訪問此腳本, 結果發現並無輸出相應的字符串,但卻生成了相應的文件.由此說明在調用fastcgi_finish_request後,客戶端響應就已經結束,但與此同時服務端腳本卻繼續運行!瀏覽器
合理利用這個特性能夠大大提高用戶體驗,趁熱打鐵再來一個例子:日誌
<?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模擬一些耗時的操做,瀏覽時沒有被堵塞,程序卻都執行了,具體看日誌.code
末了給您提個醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把內容儘快發到客戶端去,它和本文介紹的fastcgi_finish_request有些許的相似.視頻
轉載附言: 我看了下這個方法, 在調用的時候, 會發送響應, 關閉鏈接. 可是不會結束PHP的運行. 相比調用flush, 或者我以前介紹的加速你的Echo來講, 這個方法能更加乾脆一些.htm
另外, 從代碼的可移植性講的話, 能夠在代碼中附上以下代碼:圖片
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }