PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行_PHP教程
PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行
这两天弄个PHP调用 SVN 同步 update 多台服务器更新的程序,为了避免 commit 的时候不会被阻塞卡半天得想个办法只请求触发,而不需要等待程序 update 完成返回结果这样耗时太长,所以研究过了下如何让PHP主动断开连接的方法。搞了一下午,发现很多问题,还好最终还是弄出来了,主要是 Nginx 太坑。。
废话不多说,下面上代码:
<code class="hljs" java="">/** * 主动断开与客户端浏览器的连接 * 如果是 Nginx 服务器需要输出大于等于 fastcgi_buffer_size 缓存的数据才能即时输出 header 断开连接, 若还是不行可尝试关闭 gzip * 如: fastcgi_buffer_size 64k; 即: 需要 64*1024 字符(可多不可少), * 可使用 str_repeat(' ', 65536); 另外 str_repeat(' ', 6554); 这种方式其实生成速度更慢 * @param null|string $str 当前输出的内容, 若无需输出则设置为空 */ public function connectionClose($str = null) { $str = ob_get_contents() . $str; // 若实际输出内容长度小于该值将可能导致主动断开失败 header('Content-Length: '. strlen($str)); Header::connectionClose(); ob_start(); echo $str; ob_flush(); flush(); }</code>
补充说明下:
对于 apache 一般没什问题,我一开始在 windows 上用的 xampp 调试的 没发现什么问题,结果到服务器上是 Nginx ,死活不行,崩溃了一下午,后来才反映过来是 Nginx 的 fastcgi_buffer 的问题。
各种情况测试了N多次,应该没什么 BUG 了。。。
另外再说说 ignore_user_abort() 函数的问题
当浏览器关闭后,决定程序是否还会在后台继续执行,(下图的例子中,你在测试时不一定非要设置为永不超时 limit 0 ,设置一两分钟就行了,否则可能重启 HTTP 服务需要很长时间)
简单来说,如果你要用户浏览器关闭后还需要程序继续执行,那么你必须加上下面这句代码:
<code bash="" class="hljs">ignore_user_abort(true);</code>
但根据你后面程序(主要是 while 死循环)的情况不同而有些许不同:
一般在程序中你可以监控连接状态进行控制:
<code bash="" class="hljs">$isAborted = connection_aborted(); $status = connection_status(); if (0 !== $status || $isAborted) { break; }</code>
但这两个函数要想正常工作得有个前提,就是你的程序必须要有输出内容,且大于当前WebServer 的输出缓存,这样才会起作用。
如果你只是简单的输出一个空格 echo ’ ‘; 可能得循环几千次才会判断到,所以为了更即时的检测到状态你必须每次循环时输出足够多的内容才会触发状态检测。
所以这里也经常会遇到一个问题:当浏览器断开后,即使没有使用 ignore_user_abort(true); 但因为没有任何输出,导致程序仍然会继续执行,死循环会一直跑,如果设置了超时那还好,否则就真死掉了。
下面贴上测试代码(贴个图主要是为了防盗 嘿嘿~)
<code bash="" class="hljs">set_time_limit(0); ignore_user_abort(true); while (1) { echo str_repeat(' ', 65536); $isAborted = connection_aborted(); $status = connection_status(); file_put_contents('test.txt', 'time: '. time() .'; abroted:'. $isAborted .'; status: '. $status); if (0 !== $status || $isAborted) { break; } sleep(2); }</code>
你可以试试注释掉这句
// echo str_repeat(’ ‘, 65536);
另外
set_time_limit(0); 最好也别用 0

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

WordPress後台亂碼煩惱?試試這些解決方案,需要具體程式碼範例隨著WordPress在網站建置中的廣泛應用,許多用戶可能會遇到WordPress後台亂碼的問題。這種問題會導致後台管理介面顯示亂碼,對使用者的使用帶來極大困擾。本文將介紹一些常見的解決方案,幫助使用者解決WordPress後台亂碼的煩惱。修改wp-config.php檔案開啟wp-config.

標題:Discuz後台帳號登入異常,如何處理?當你使用Discuz論壇系統的後台管理時,有時候可能會遇到帳號登入異常的情況。這可能是由於多種原因導致的,可能是密碼錯誤、帳號被封鎖、網路連線問題等。在遇到這種情況時,我們需要透過簡單的排查和處理來解決這個問題。檢查帳號和密碼是否正確:首先,確認你輸入的帳號和密碼是否正確。登入時,請確保大小寫輸入正確,密碼是否

win11如何禁止軟體後台運作?我們在使用一些軟體,不使用的時候,就會關掉掉軟體,有些軟體關閉後還會在後台運行,在後台運行的過程中,電腦會造成一定的卡頓,就有小伙伴想知道應該如何在win11中禁止軟體後台運作。小編下面整理了win11禁止軟體後台運作步驟,有興趣的話,跟著小編一起往下看看吧! win11禁止軟體後台運行步驟1、按下快捷鍵“win+X”,在上方給出的選項中選擇“設定”。 2、進入新介面後,點選“應用”,接著找到右側的“應用程式和功能”。 3、其中,找到“Microsoft資訊”,點擊

Discuz後台登入失敗?教你輕鬆解決!隨著Discuz作為一款流行的論壇平台,在網站搭建和管理中被廣泛使用,有時會遇到後台登入失敗的情況,讓人感到困擾。今天我們就來討論一下可能導致Discuz後台登入失敗的問題,並提供一些解決方案,也會附上具體的程式碼範例。希望本文能幫助遇到類似問題的網站管理員和開發者。 1.問題排查在解決Discuz後台登入失敗的問題之

透過進程的前後台切換方式實現不同應用的切換。背景:linux啟動一個程式後,切換到背景執行,想繼續在linux操作。在Linux中,你可以使用以下幾種方法使一個程式在後台啟動並退出,但仍然保持其進程運行:一、Linux啟動一個程式在後台執行1.使用nohup和&:$nohupyour_program&使用nohup命令可以使程式忽略掛斷訊號(SIGHUP),這樣即使你退出了終端,程式也會繼續運作。 &符號使程式在背景運作。 2.使用ctrl+Z:如果你已經在前台啟動了程序,可以使用ct

如何正確使用nohup進行後台任務處理在日常工作中,我們經常需要執行一些耗時較長的任務,例如檔案複製、資料處理等。為了不影響我們的工作效率,並且保證任務能夠在後台穩定運行,我們可以使用nohup命令來啟動這些任務。本文將介紹如何正確使用nohup進行後台任務處理。什麼是nohup指令? nohup是Unix和類別Unix作業系統的一個命令,用於在背景執行命令或腳

ThinkPHP6後台管理系統開發:實現後台功能簡介:隨著網路技術和市場需求的不斷發展,越來越多的企業和組織需要一個高效、安全、靈活的後台管理系統來管理業務資料和進行營運管理。本文將使用ThinkPHP6框架,透過實例示範如何開發一個簡單但實用的後台管理系統,包括權限控制、資料增刪改查等基本功能。環境準備在開始之前,我們需要先安裝好PHP、MySQL、Com
