


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

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Penyelesaian masalah log masuk latar belakang Discuz didedahkan. ramai webmaster. Walau bagaimanapun, dengan tepat kerana fungsinya yang berkuasa, kadangkala kami menghadapi beberapa masalah semasa menggunakan Discuz, seperti masalah log masuk latar belakang. Hari ini, kami akan mendedahkan penyelesaian kepada masalah log masuk latar belakang Discuz dan memberikan contoh kod khusus, dengan harapan dapat membantu mereka yang memerlukan

Adakah anda bimbang tentang kod berantakan bahagian belakang WordPress? Cuba penyelesaian ini, contoh kod khusus diperlukan Dengan aplikasi WordPress yang meluas dalam pembinaan laman web, ramai pengguna mungkin menghadapi masalah kod bercelaru di bahagian belakang WordPress. Masalah seperti ini akan menyebabkan antara muka pengurusan latar belakang memaparkan aksara bercelaru, menyebabkan masalah besar kepada pengguna. Artikel ini akan memperkenalkan beberapa penyelesaian biasa untuk membantu pengguna menyelesaikan masalah watak bercelaru dalam bahagian belakang WordPress. Ubah suai fail wp-config.php dan buka wp-config.

Tajuk: Discuz pengecualian log masuk akaun latar belakang, bagaimana untuk menanganinya? Apabila anda menggunakan pengurusan bahagian belakang sistem forum Discuz, kadangkala anda mungkin menghadapi log masuk akaun yang tidak normal. Ini mungkin disebabkan oleh pelbagai sebab, termasuk kata laluan yang salah, akaun disekat, isu sambungan rangkaian, dsb. Apabila menghadapi situasi ini, kita perlu menyelesaikan masalah melalui penyelesaian masalah dan pemprosesan yang mudah. Semak sama ada nombor akaun dan kata laluan adalah betul: Mula-mula, sahkan sama ada nombor akaun dan kata laluan yang anda masukkan adalah betul. Semasa log masuk, pastikan huruf besar adalah betul dan kata laluan adalah betul

Bagaimana untuk melumpuhkan perisian daripada berjalan di latar belakang dalam win11? Kami menggunakan beberapa perisian Apabila kami tidak menggunakannya, kami akan menutup perisian Beberapa perisian masih akan berjalan di latar belakang selepas ia ditutup Semasa proses berjalan di latar belakang, komputer akan menyebabkan lag tertentu . Sesetengah rakan ingin tahu apa yang perlu dilakukan Bagaimana untuk melumpuhkan perisian daripada berjalan di latar belakang dalam win11. Editor di bawah telah menyusun langkah-langkah untuk melumpuhkan perisian daripada berjalan di latar belakang dalam Win11 Jika anda berminat, ikuti editor dan lihat di bawah! Langkah-langkah untuk melumpuhkan perisian yang berjalan di latar belakang dalam win11: 1. Tekan kekunci pintasan "win+X" dan pilih "Tetapan" daripada pilihan yang diberikan di atas. 2. Selepas memasuki antara muka baharu, klik "Apl" dan kemudian cari "Aplikasi dan Ciri" di sebelah kanan. 3. Di dalamnya, cari "Maklumat Microsoft" dan klik

Discuz log masuk latar belakang gagal? Ajar anda cara menyelesaikannya dengan mudah! Memandangkan Discuz, sebagai platform forum popular, digunakan secara meluas dalam pembinaan dan pengurusan laman web, kadangkala anda akan menghadapi kegagalan log masuk bahagian belakang, yang merisaukan. Hari ini kita akan membincangkan isu yang mungkin menyebabkan kegagalan log masuk bahagian belakang Discuz, menyediakan beberapa penyelesaian dan melampirkan contoh kod tertentu. Saya harap artikel ini dapat membantu juruweb dan pembangun yang menghadapi masalah yang sama. 1. Penyelesaian masalah adalah untuk menyelesaikan masalah kegagalan log masuk latar belakang Discuz.

Bertukar antara aplikasi yang berbeza dicapai melalui proses penukaran hadapan dan belakang. Latar Belakang: Selepas Linux memulakan program, ia beralih ke latar belakang untuk pelaksanaan dan mahu terus beroperasi di Linux. Di Linux, anda boleh menggunakan kaedah berikut untuk memulakan program dan keluar di latar belakang, tetapi masih meneruskan prosesnya: 1. Linux memulakan program untuk melaksanakan di latar belakang 1. Gunakan nohup dan &: $nohupyour_program& Gunakan arahan nohup untuk membuat Program mengabaikan isyarat gantung (SIGHUP) supaya atur cara terus berjalan walaupun anda keluar dari terminal. Simbol & menyebabkan program berjalan di latar belakang. 2. Gunakan ctrl+Z: Jika anda telah memulakan program di latar depan, anda boleh menggunakan ct

Pembangunan sistem pengurusan bahagian belakang ThinkPHP6: Melaksanakan fungsi bahagian belakang Pengenalan: Dengan pembangunan berterusan teknologi Internet dan permintaan pasaran, semakin banyak perusahaan dan organisasi memerlukan sistem pengurusan bahagian belakang yang cekap, selamat dan fleksibel untuk mengurus data perniagaan dan menjalankan pengurusan operasi. Artikel ini akan menggunakan rangka kerja ThinkPHP6 untuk menunjukkan melalui contoh cara membangunkan sistem pengurusan bahagian belakang yang mudah tetapi praktikal, termasuk fungsi asas seperti kawalan kebenaran, penambahan data, pemadaman, pengubahsuaian dan pertanyaan. Persediaan persekitaran Sebelum bermula, kita perlu memasang PHP, MySQL, Com

Cara menggunakan nohup dengan betul untuk pemprosesan tugas latar belakang Dalam kerja harian, kita selalunya perlu melakukan beberapa tugasan yang memakan masa, seperti penyalinan fail, pemprosesan data, dsb. Untuk tidak menjejaskan kecekapan kerja kami dan memastikan tugasan dapat berjalan dengan stabil di latar belakang, kami boleh menggunakan arahan nohup untuk memulakan tugasan ini. Artikel ini akan memperkenalkan cara menggunakan nohup dengan betul untuk pemprosesan tugas latar belakang. Apakah arahan nohup? nohup ialah arahan dalam sistem pengendalian seperti Unix dan Unix yang digunakan untuk menjalankan arahan atau skrip di latar belakang.
