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