使用fastcgi_finish_request提升頁面響應速度

當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() {
          }
    }
相關文章
相關標籤/搜索