摘要:基本應用介紹沖刷所有響應的數據給客戶端此函數沖刷所有響應的數據給客戶端并結束請求。需要長時間處理的代碼處理完成后刪除進程記錄文件參考非阻塞實現方法
前言
在實際項目中經常會有這樣的需求,對于前端發過來的請求,需要在后端進行長時間的處理,但為了讓使用者有更好的體驗,為了讓PHP在后端處理長時間任務時不阻塞,快速響應頁面請求,因此在這里對fastcgi_finish_request的應用進行總結歸納。當然php實現非阻塞的方式有很多種,比如異步腳本、swoole,但個人認為fastcgi_finish_request最為簡單方便。
基本應用 fastcgi_finish_request介紹(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request — 沖刷(flush)所有響應的數據給客戶端
boolean fastcgi_finish_request ( void )
此函數沖刷(flush)所有響應的數據給客戶端并結束請求。 這使得客戶端結束連接后,需要大量時間運行的任務能夠繼續運行。
返回值成功時返回 TRUE, 或者在失敗時返回 FALSE
注意問題PHP 與 Web 服務器使用了PHP-FPM(FastCGI進程管理器),那通過fastcgi_finish_request() 函數能馬上結束會話,而 PHP 線程可以繼續在后臺運行。也就是說只針對php-fpm的進程管理方式才能使用該函數
只要代碼運行到這個位置,就已經斷開請求返回參數給客戶端了。接下來的代碼都和客戶端沒有關系了。也就是說對于輸出在頁面的內容必須放在fastcgi_finish_request函數之前
fastcgi_finish_request()結束客戶端連接之后,運行時間依然會受max_execution_time超時時間的影響,也就是說如果預計到代碼在后端執行時間比較久,還是要設定set_time_limit(0)
在高并發下執行時間過久也會導致fastcgi進程不夠用,不能及時釋放,就會爆502錯誤了。
應用echo "program start..."; file_put_contents("/tmp/garylog.log","start-time:".date("Y-m-d H:i:s")." ", FILE_APPEND); fastcgi_finish_request();sleep(1); // set_time_limit(0); // sleep(150); $num = 25; $num += 1; sleep(5); echo "debug..."; file_put_contents("/tmp/garylog.log", "start-proceed:".$num.",時間".date("Y-m-d H:i:s")." ", FILE_APPEND); sleep(10); file_put_contents("/tmp/garylog.log", "end-time:".date("Y-m-d H:i:s")." ", FILE_APPEND);
運行測試
從代碼的可移植性講的話, 可以在代碼中附上如下代碼:
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }
不會造成代碼部署在非fpm環境下造成問題.
保證進程單一運行對于上面說到的問題:在高并發下執行時間過久也會導致fastcgi進程不夠用,不能及時釋放。同時我們的需求僅僅是為了起到觸發的作用,并不需要每次運行,那么可以考慮使用下面的方法,避免重復占用進程。
$processId = realpath(__FILE__) . "-" . get_class($this); $filename = md5($processId); $file = "/tmp/".$filename; if(!file_exists($filename)){ file_put_contents($file, getmypid()); }else{ return true; } ## do somthing 需要長時間處理的代碼 //處理完成后刪除進程id記錄文件 unlink($file);參考
PHP非阻塞實現方法
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31637.html
摘要:基本應用介紹沖刷所有響應的數據給客戶端此函數沖刷所有響應的數據給客戶端并結束請求。需要長時間處理的代碼處理完成后刪除進程記錄文件參考非阻塞實現方法 前言 在實際項目中經常會有這樣的需求,對于前端發過來的請求,需要在后端進行長時間的處理,但為了讓使用者有更好的體驗,為了讓PHP在后端處理長時間任務時不阻塞,快速響應頁面請求,因此在這里對fastcgi_finish_request的應用進...
摘要:基本應用介紹沖刷所有響應的數據給客戶端此函數沖刷所有響應的數據給客戶端并結束請求。需要長時間處理的代碼處理完成后刪除進程記錄文件參考非阻塞實現方法 前言 在實際項目中經常會有這樣的需求,對于前端發過來的請求,需要在后端進行長時間的處理,但為了讓使用者有更好的體驗,為了讓PHP在后端處理長時間任務時不阻塞,快速響應頁面請求,因此在這里對fastcgi_finish_request的應用進...
摘要:輸出的性能數據中添加數據。中間是要分析的代碼。是一個繪制圖形的工具,可以更為直觀的讓你查看性能的瓶頸。這樣所有使用該環境的都會生效。這樣僅該項目生效。 安裝xhprof擴展 wget http://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0.9.4.tgz cd xhprof-0.9.4/extension/ sudo phpi...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...
閱讀 3201·2021-11-18 10:02
閱讀 1456·2021-10-12 10:08
閱讀 1255·2021-10-11 10:58
閱讀 1277·2021-10-11 10:57
閱讀 1173·2021-10-08 10:04
閱讀 2125·2021-09-29 09:35
閱讀 778·2021-09-22 15:44
閱讀 1279·2021-09-03 10:30