神奇的Fastcgi_Finish_Request

當PHP運行在FastCGI模式時,PHP FPM提供了一個名爲fastcgi_finish_request的方法。按照文檔上的說法,此方法能夠提升請求的處理速度,若是有些處理能夠在頁面生成完後再進行,就能夠使用這個方法。php

聽起來可能有些茫然,咱們經過幾個例子來講明一下:html

<?php

echo '例子:';

fastcgi_finish_request();

echo 'To be, or not to be, that is the question.';

file_put_contents('log.txt', '生存仍是毀滅,這是個問題。');

?>

經過瀏覽器(不是命令行!)運行此腳本,結果發現並無輸出相應的字符串,但卻生成了相應的文件。由此說明在調用fastcgi_finish_request後,客戶端響應就已經結束,但與此同時服務端腳本卻繼續運行!瀏覽器

合理利用這個特性能夠大大提高用戶體驗,趁熱打鐵再來一個例子:ide

<?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模擬耗時的操做,瀏覽時沒有被堵塞,程序卻都執行了,具體看日誌。php-fpm

末了給您提個醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把內容儘快發到客戶端去,雖然表面上它和本文介紹的fastcgi_finish_request有些許的相似,但本質上徹底不一樣,別混淆了。spa



http://huoding.com/2011/04/12/63.net

相關文章
相關標籤/搜索