摘要:基本應(yīng)用介紹沖刷所有響應(yīng)的數(shù)據(jù)給客戶端此函數(shù)沖刷所有響應(yīng)的數(shù)據(jù)給客戶端并結(jié)束請(qǐng)求。需要長(zhǎng)時(shí)間處理的代碼處理完成后刪除進(jìn)程記錄文件參考非阻塞實(shí)現(xiàn)方法
前言
在實(shí)際項(xiàng)目中經(jīng)常會(huì)有這樣的需求,對(duì)于前端發(fā)過(guò)來(lái)的請(qǐng)求,需要在后端進(jìn)行長(zhǎng)時(shí)間的處理,但為了讓使用者有更好的體驗(yàn),為了讓PHP在后端處理長(zhǎng)時(shí)間任務(wù)時(shí)不阻塞,快速響應(yīng)頁(yè)面請(qǐng)求,因此在這里對(duì)fastcgi_finish_request的應(yīng)用進(jìn)行總結(jié)歸納。當(dāng)然php實(shí)現(xiàn)非阻塞的方式有很多種,比如異步腳本、swoole,但個(gè)人認(rèn)為fastcgi_finish_request最為簡(jiǎn)單方便。
基本應(yīng)用 fastcgi_finish_request介紹(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request — 沖刷(flush)所有響應(yīng)的數(shù)據(jù)給客戶端
boolean fastcgi_finish_request ( void )
此函數(shù)沖刷(flush)所有響應(yīng)的數(shù)據(jù)給客戶端并結(jié)束請(qǐng)求。 這使得客戶端結(jié)束連接后,需要大量時(shí)間運(yùn)行的任務(wù)能夠繼續(xù)運(yùn)行。
返回值成功時(shí)返回 TRUE, 或者在失敗時(shí)返回 FALSE
注意問(wèn)題PHP 與 Web 服務(wù)器使用了PHP-FPM(FastCGI進(jìn)程管理器),那通過(guò)fastcgi_finish_request() 函數(shù)能馬上結(jié)束會(huì)話,而 PHP 線程可以繼續(xù)在后臺(tái)運(yùn)行。也就是說(shuō)只針對(duì)php-fpm的進(jìn)程管理方式才能使用該函數(shù)
只要代碼運(yùn)行到這個(gè)位置,就已經(jīng)斷開請(qǐng)求返回參數(shù)給客戶端了。接下來(lái)的代碼都和客戶端沒有關(guān)系了。也就是說(shuō)對(duì)于輸出在頁(yè)面的內(nèi)容必須放在fastcgi_finish_request函數(shù)之前
fastcgi_finish_request()結(jié)束客戶端連接之后,運(yùn)行時(shí)間依然會(huì)受max_execution_time超時(shí)時(shí)間的影響,也就是說(shuō)如果預(yù)計(jì)到代碼在后端執(zhí)行時(shí)間比較久,還是要設(shè)定set_time_limit(0)
在高并發(fā)下執(zhí)行時(shí)間過(guò)久也會(huì)導(dǎo)致fastcgi進(jìn)程不夠用,不能及時(shí)釋放,就會(huì)爆502錯(cuò)誤了。
應(yīng)用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.",時(shí)間".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);
運(yùn)行測(cè)試
從代碼的可移植性講的話, 可以在代碼中附上如下代碼:
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }
不會(huì)造成代碼部署在非fpm環(huán)境下造成問(wèn)題.
保證進(jìn)程單一運(yùn)行對(duì)于上面說(shuō)到的問(wèn)題:在高并發(fā)下執(zhí)行時(shí)間過(guò)久也會(huì)導(dǎo)致fastcgi進(jìn)程不夠用,不能及時(shí)釋放。同時(shí)我們的需求僅僅是為了起到觸發(fā)的作用,并不需要每次運(yùn)行,那么可以考慮使用下面的方法,避免重復(fù)占用進(jìn)程。
$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 需要長(zhǎng)時(shí)間處理的代碼 //處理完成后刪除進(jìn)程id記錄文件 unlink($file);參考
PHP非阻塞實(shí)現(xiàn)方法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30831.html
摘要:基本應(yīng)用介紹沖刷所有響應(yīng)的數(shù)據(jù)給客戶端此函數(shù)沖刷所有響應(yīng)的數(shù)據(jù)給客戶端并結(jié)束請(qǐng)求。需要長(zhǎng)時(shí)間處理的代碼處理完成后刪除進(jìn)程記錄文件參考非阻塞實(shí)現(xiàn)方法 前言 在實(shí)際項(xiàng)目中經(jīng)常會(huì)有這樣的需求,對(duì)于前端發(fā)過(guò)來(lái)的請(qǐng)求,需要在后端進(jìn)行長(zhǎng)時(shí)間的處理,但為了讓使用者有更好的體驗(yàn),為了讓PHP在后端處理長(zhǎng)時(shí)間任務(wù)時(shí)不阻塞,快速響應(yīng)頁(yè)面請(qǐng)求,因此在這里對(duì)fastcgi_finish_request的應(yīng)用進(jìn)...
摘要:基本應(yīng)用介紹沖刷所有響應(yīng)的數(shù)據(jù)給客戶端此函數(shù)沖刷所有響應(yīng)的數(shù)據(jù)給客戶端并結(jié)束請(qǐng)求。需要長(zhǎng)時(shí)間處理的代碼處理完成后刪除進(jìn)程記錄文件參考非阻塞實(shí)現(xiàn)方法 前言 在實(shí)際項(xiàng)目中經(jīng)常會(huì)有這樣的需求,對(duì)于前端發(fā)過(guò)來(lái)的請(qǐng)求,需要在后端進(jìn)行長(zhǎng)時(shí)間的處理,但為了讓使用者有更好的體驗(yàn),為了讓PHP在后端處理長(zhǎng)時(shí)間任務(wù)時(shí)不阻塞,快速響應(yīng)頁(yè)面請(qǐng)求,因此在這里對(duì)fastcgi_finish_request的應(yīng)用進(jìn)...
摘要:輸出的性能數(shù)據(jù)中添加數(shù)據(jù)。中間是要分析的代碼。是一個(gè)繪制圖形的工具,可以更為直觀的讓你查看性能的瓶頸。這樣所有使用該環(huán)境的都會(huì)生效。這樣僅該項(xiàng)目生效。 安裝xhprof擴(kuò)展 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...
摘要:阻塞,非阻塞首先,阻塞這個(gè)詞來(lái)自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語(yǔ)言現(xiàn)未來(lái)已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個(gè)月的業(yè)余時(shí)間用 Laravel 開發(fā)了一個(gè)項(xiàng)目,在此之前,除了去年換工作準(zhǔn)備面試時(shí),我并...
摘要:阻塞,非阻塞首先,阻塞這個(gè)詞來(lái)自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語(yǔ)言現(xiàn)未來(lái)已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個(gè)月的業(yè)余時(shí)間用 Laravel 開發(fā)了一個(gè)項(xiàng)目,在此之前,除了去年換工作準(zhǔn)備面試時(shí),我并...
閱讀 3070·2023-04-25 16:50
閱讀 904·2021-11-25 09:43
閱讀 3512·2021-09-26 10:11
閱讀 2518·2019-08-26 13:28
閱讀 2531·2019-08-26 13:23
閱讀 2419·2019-08-26 11:53
閱讀 3566·2019-08-23 18:19
閱讀 2987·2019-08-23 16:27