


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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La solution au problème de connexion en arrière-plan de Discuz est révélée. Des exemples de code spécifiques sont nécessaires Avec le développement rapide d'Internet, la construction de sites Web est devenue de plus en plus courante, et Discuz, en tant que système de création de sites Web de forum couramment utilisé, a été favorisé par. de nombreux webmasters. Cependant, précisément en raison de ses fonctions puissantes, nous rencontrons parfois des problèmes lors de l'utilisation de Discuz, comme des problèmes de connexion en arrière-plan. Aujourd'hui, nous allons révéler la solution au problème de connexion en arrière-plan de Discuz et fournir des exemples de code spécifiques. Nous espérons aider ceux qui en ont besoin.

Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions, des exemples de code spécifiques sont nécessaires. Avec l’application généralisée de WordPress dans la construction de sites Web, de nombreux utilisateurs peuvent rencontrer le problème d’un code tronqué dans le backend WordPress. Ce type de problème entraînera l'affichage de caractères tronqués dans l'interface de gestion en arrière-plan, causant de gros problèmes aux utilisateurs. Cet article présentera quelques solutions courantes pour aider les utilisateurs à résoudre le problème des caractères tronqués dans le backend WordPress. Modifiez le fichier wp-config.php et ouvrez wp-config.

Titre : Exception de connexion au compte en arrière-plan Discuz, comment y faire face ? Lorsque vous utilisez la gestion backend du système de forum Discuz, vous pouvez parfois rencontrer une connexion anormale au compte. Cela peut être dû à diverses raisons, notamment un mot de passe erroné, un compte bloqué, des problèmes de connexion réseau, etc. Lorsque nous sommes confrontés à cette situation, nous devons résoudre le problème par un dépannage et un traitement simples. Vérifiez si le numéro de compte et le mot de passe sont corrects : Tout d'abord, confirmez si le numéro de compte et le mot de passe que vous avez saisis sont corrects. Lors de la connexion, assurez-vous que la majuscule est correcte et que le mot de passe est

La connexion en arrière-plan à Discuz a échoué ? Apprenez-vous à le résoudre facilement ! Comme Discuz, en tant que plate-forme de forum populaire, est largement utilisé dans la construction et la gestion de sites Web, vous rencontrerez parfois des échecs de connexion au backend, ce qui est troublant. Aujourd'hui, nous allons discuter des problèmes pouvant entraîner l'échec de la connexion au backend de Discuz, fournir des solutions et joindre des exemples de code spécifiques. J'espère que cet article pourra aider les webmasters et les développeurs qui rencontrent des problèmes similaires. 1. Le dépannage consiste à résoudre le problème de l'échec de la connexion en arrière-plan de Discuz.

Comment désactiver l’exécution d’un logiciel en arrière-plan dans Win11 ? Nous utilisons certains logiciels. Lorsque nous ne les utilisons pas, nous fermerons le logiciel. Certains logiciels fonctionneront toujours en arrière-plan après leur fermeture. Pendant le processus d'exécution en arrière-plan, l'ordinateur provoquera un certain décalage. . Certains amis veulent savoir ce qu'il faut faire. Comment désactiver l'exécution d'un logiciel en arrière-plan dans Win11. L'éditeur ci-dessous a compilé les étapes pour désactiver l'exécution du logiciel en arrière-plan dans Win11. Si vous êtes intéressé, suivez l'éditeur et jetez un œil ci-dessous ! Étapes pour désactiver le logiciel exécuté en arrière-plan dans win11 : 1. Appuyez sur la touche de raccourci "win+X" et sélectionnez "Paramètres" parmi les options indiquées ci-dessus. 2. Après avoir accédé à la nouvelle interface, cliquez sur « Applications », puis recherchez « Applications et fonctionnalités » sur la droite. 3. Dans celui-ci, recherchez « Informations Microsoft » et cliquez sur

La commutation entre différentes applications est réalisée grâce à la commutation avant et arrière des processus. Contexte : une fois que Linux a démarré un programme, il passe en arrière-plan pour son exécution et souhaite continuer à fonctionner sous Linux. Sous Linux, vous pouvez utiliser les méthodes suivantes pour démarrer un programme et le quitter en arrière-plan, tout en gardant son processus en cours d'exécution : 1. Linux démarre un programme à exécuter en arrière-plan 1. Utilisez nohup et & : $nohupyour_program& Utilisez la commande nohup faire Le programme ignore le signal de raccrochage (SIGHUP) afin que le programme continue de s'exécuter même si vous quittez le terminal. Le symbole & entraîne l'exécution du programme en arrière-plan. 2. Utilisez ctrl+Z : Si vous avez démarré le programme au premier plan, vous pouvez utiliser ct

Développement du système de gestion backend ThinkPHP6 : implémentation des fonctions backend Introduction : Avec le développement continu de la technologie Internet et la demande du marché, de plus en plus d'entreprises et d'organisations ont besoin d'un système de gestion backend efficace, sûr et flexible pour gérer les données commerciales et effectuer la gestion opérationnelle. Cet article utilisera le framework ThinkPHP6 pour démontrer à travers des exemples comment développer un système de gestion backend simple mais pratique, comprenant des fonctions de base telles que le contrôle des autorisations, l'ajout de données, la suppression, la modification et la requête. Préparation de l'environnement Avant de commencer, nous devons installer PHP, MySQL, Com

Comment utiliser correctement nohup pour le traitement des tâches en arrière-plan Dans le travail quotidien, nous devons souvent effectuer certaines tâches fastidieuses, telles que la copie de fichiers, le traitement de données, etc. Afin de ne pas affecter l'efficacité de notre travail et de garantir que les tâches peuvent s'exécuter de manière stable en arrière-plan, nous pouvons utiliser la commande nohup pour démarrer ces tâches. Cet article explique comment utiliser correctement nohup pour le traitement des tâches en arrière-plan. Qu'est-ce que la commande nohup ? nohup est une commande dans les systèmes d'exploitation Unix et de type Unix utilisée pour exécuter des commandes ou des scripts en arrière-plan.
