Table des matières
PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行
废话不多说,下面上代码:
补充说明下:
另外再说说 ignore_user_abort() 函数的问题
下面贴上测试代码(贴个图主要是为了防盗 嘿嘿~)
Maison développement back-end tutoriel php PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行_PHP教程

PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行_PHP教程

Jul 13, 2016 am 09:45 AM
后台

PHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行

这两天弄个PHP调用 SVN 同步 update 多台服务器更新的程序,为了避免 commit 的时候不会被阻塞卡半天得想个办法只请求触发,而不需要等待程序 update 完成返回结果这样耗时太长,所以研究过了下如何让PHP主动断开连接的方法。搞了一下午,发现很多问题,还好最终还是弄出来了,主要是 Nginx 太坑。。


废话不多说,下面上代码:


PHP


<code class="hljs" java="">/**
 * 主动断开与客户端浏览器的连接
 * 如果是 Nginx 服务器需要输出大于等于 fastcgi_buffer_size 缓存的数据才能即时输出 header 断开连接, 若还是不行可尝试关闭 gzip
 * 如: fastcgi_buffer_size 64k; 即: 需要 64*1024 字符(可多不可少),
 * 可使用 str_repeat(&#39; &#39;, 65536); 另外 str_repeat(&#39;          &#39;, 6554); 这种方式其实生成速度更慢
 * @param null|string $str 当前输出的内容, 若无需输出则设置为空
 */
public function connectionClose($str = null) {
    $str = ob_get_contents() . $str;
    // 若实际输出内容长度小于该值将可能导致主动断开失败
    header(&#39;Content-Length: &#39;. strlen($str));
    Header::connectionClose();
    ob_start();
    echo $str;
    ob_flush();
    flush();
}</code>
Copier après la connexion

补充说明下:

对于 apache 一般没什问题,我一开始在 windows 上用的 xampp 调试的 没发现什么问题,结果到服务器上是 Nginx ,死活不行,崩溃了一下午,后来才反映过来是 Nginx 的 fastcgi_buffer 的问题。

各种情况测试了N多次,应该没什么 BUG 了。。。


另外再说说 ignore_user_abort() 函数的问题

当浏览器关闭后,决定程序是否还会在后台继续执行,(下图的例子中,你在测试时不一定非要设置为永不超时 limit 0 ,设置一两分钟就行了,否则可能重启 HTTP 服务需要很长时间)


PHP


简单来说,如果你要用户浏览器关闭后还需要程序继续执行,那么你必须加上下面这句代码:

<code bash="" class="hljs">ignore_user_abort(true);</code>
Copier après la connexion

但根据你后面程序(主要是 while 死循环)的情况不同而有些许不同:

一般在程序中你可以监控连接状态进行控制:

<code bash="" class="hljs">$isAborted = connection_aborted();
$status = connection_status();
if (0 !== $status || $isAborted) {
    break;
}</code>
Copier après la connexion

但这两个函数要想正常工作得有个前提,就是你的程序必须要有输出内容,且大于当前WebServer 的输出缓存,这样才会起作用。

如果你只是简单的输出一个空格 echo ’ ‘; 可能得循环几千次才会判断到,所以为了更即时的检测到状态你必须每次循环时输出足够多的内容才会触发状态检测。

所以这里也经常会遇到一个问题:当浏览器断开后,即使没有使用 ignore_user_abort(true); 但因为没有任何输出,导致程序仍然会继续执行,死循环会一直跑,如果设置了超时那还好,否则就真死掉了。


下面贴上测试代码(贴个图主要是为了防盗 嘿嘿~)


<code bash="" class="hljs">set_time_limit(0);

ignore_user_abort(true);

while (1) {
    echo str_repeat(&#39; &#39;, 65536);
    $isAborted = connection_aborted();
    $status = connection_status();
    file_put_contents(&#39;test.txt&#39;, &#39;time: &#39;. time() .&#39;; abroted:&#39;. $isAborted .&#39;; status: &#39;. $status);
    if (0 !== $status || $isAborted) {
        break;
    }
    sleep(2);
}</code>
Copier après la connexion

你可以试试注释掉这句
// echo str_repeat(’ ‘, 65536);
另外
set_time_limit(0); 最好也别用 0

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1036923.htmlTechArticlePHP 在 Nginx 下主动断开连接 Connection Close 与 ignore_user_abort 后台运行 这两天弄个PHP调用 SVN 同步 update 多台服务器更新的程序,为了避免 com...
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

La solution au problème de connexion en arrière-plan Discuz révélée La solution au problème de connexion en arrière-plan Discuz révélée Mar 03, 2024 am 08:57 AM

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 Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions Mar 05, 2024 pm 09:27 PM

Ê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.

Discuzez de l'exception de connexion au compte en arrière-plan, comment y faire face ? Discuzez de l'exception de connexion au compte en arrière-plan, comment y faire face ? Mar 09, 2024 pm 05:51 PM

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 ! La connexion en arrière-plan à Discuz a échoué ? Apprenez-vous à le résoudre facilement ! Mar 02, 2024 pm 06:03 PM

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 en arrière-plan du logiciel dans Win11 ? Comment désactiver l'exécution en arrière-plan du logiciel dans Win11 ? Jun 30, 2023 am 08:17 AM

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

Comment basculer en douceur entre différentes applications sous le système Linux Comment basculer en douceur entre différentes applications sous le système Linux Feb 19, 2024 pm 03:00 PM

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 : réalisation des fonctions backend Développement du système de gestion backend ThinkPHP6 : réalisation des fonctions backend Aug 27, 2023 am 11:55 AM

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 Comment utiliser correctement nohup pour le traitement des tâches en arrière-plan Mar 26, 2024 am 09:39 AM

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.

See all articles