在實際項目中經常會有這樣的需求,對于前端發過來的請求,需要在后端進行長時間的處理,但為了讓使用者有更好的體驗,為了讓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 ). /n , 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 ). /n , FILE_APPEND);sleep(10);file_put_contents( /tmp/garylog.log , end-time: .date( Y-m-d H:i:s ). /n , FILE_APPEND);
運行測試
兼容非php-fpm
從代碼的可移植性講的話, 可以在代碼中附上如下代碼:
if (!function_exists( fastcgi_finish_request )) { function fastcgi_finish_request() { }
不會造成代碼部署在非fpm環境下造成問題.
保證進程單一運行對于上面說到的問題:在高并發下執行時間過久也會導致fastcgi進程不夠用,不能及時釋放。同時我們的需求僅僅是為了起到觸發的作用,并不需要每次運行,那么可以考慮使用下面的方法,避免重復占用進程。
$processId = realpath(__FILE__) . - . get_html' target='_blank'>class($this);$filename = md5($processId);$file = /tmp/ .$filename;if(!file_exists($filename)){ file_put_contents($file, getmypid());}else{ return true;
獨孤九賤(5)_ThinkPHP5視頻教程ThinkPHP是國內最流行的中文PHP開發框架,也是您Web項目的最佳選擇?!禫eVb.com獨孤九賤(5)-ThinkPHP5視頻教程》課程以ThinkPHP5最新版本為例,從最基本的框架常識開始,將...
Peter-Zhu 2017-05-16 12:03:57
獨孤九賤(4)_PHP視頻教程江湖傳言:PHP是世界上最好的編程語言。真的是這樣嗎?這個梗究竟是從哪來的?學會本課程,你就會明白了。PHP 出品的PHP入門系統教學視頻,完全從初學者的角度出發,絕不玩虛的,一切以實用、有用...
Peter-Zhu 2017-03-20 22:47:17
獨孤九賤(1)_HTML5視頻教程《VeVb.com原創html5視頻教程》課程特色:php 原創幽默段子系列課程,以惡搞,段子為主題風格的php視頻教程!輕松的教學風格,簡短的教學模式,讓同學們在不知不覺中,學會了HTML知識。...
Peter-Zhu 2017-03-13 10:15:11
ThinkPHP5實戰之[教學管理系統]本套教程,以一個真實的學校教學管理系統為案例,手把手教會您如何在一張白紙上,從零開始,一步一步的用ThinkPHP5框架快速開發出一個商業項目。
Peter-Zhu 2017-07-24 16:48:56
PHP入門視頻教程之一周學會PHP所有計算機語言的學習都要從基礎開始,《PHP入門視頻教程之一周學會PHP》不僅是PHP的基礎部分更主要的是PHP語言的核心技術,是學習PHP必須掌握的內容,任何PHP項目的實現都離不開這部分的內容,通...
PHP教程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答