Maison >développement back-end >tutoriel php >Introduction à fastcgi_finish_request en php et son code non bloquant
Cet article vous présente une introduction à fastcgi_finish_request en PHP et son code non bloquant. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Dans les projets réels, une telle demande existe souvent. Les demandes envoyées depuis le front-end doivent être traitées longtemps dans le back-end, mais afin de fournir aux utilisateurs. meilleure expérience, afin d'éviter que PHP ne se bloque lors du traitement de tâches à long terme sur le backend et de répondre rapidement aux demandes de pages, l'application de fastcgi_finish_request est résumée ici. Bien sûr, il existe de nombreuses façons d'implémenter le non-blocage en PHP, comme les scripts asynchrones et swoole, mais personnellement, je pense que fastcgi_finish_request est le plus simple et le plus pratique.
(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request — vider toutes les réponses Données vers le client
boolean fastcgi_finish_request (void)Cette fonction vide toutes les données de réponse vers le client et met fin à la requête. Cela permet aux tâches dont l'exécution prend beaucoup de temps de continuer à s'exécuter une fois que le client a mis fin à la connexion.
Renvoie VRAI en cas de succès, ou FAUX en cas d'échec
PHP utilisé avec le serveur Web Si PHP- FPM (FastCGI Process Manager) est installé, la session peut être terminée immédiatement via la fonction fastcgi_finish_request() et le thread PHP peut continuer à s'exécuter en arrière-plan. En d'autres termes, cette fonction ne peut être utilisée que pour la méthode de gestion de processus de php-fpm
Tant que le code s'exécute jusqu'à cette position, la requête a été déconnectée et les paramètres renvoyés au client. Le code suivant n'a rien à voir avec le client. C'est-à-dire que le contenu affiché sur la page doit être placé avant la fonction fastcgi_finish_request
Après que fastcgi_finish_request() ait terminé la connexion client, le temps d'exécution sera toujours affecté par le délai d'attente max_execution_time. , c'est-à-dire que si vous prévoyez que l'exécution du code sur le backend prendra beaucoup de temps, vous devez toujours définir set_time_limit(0)
si le temps d'exécution est trop long. longtemps sous une concurrence élevée, cela rendra également le processus fastcgi insuffisant et ne pourra pas être publié à temps, une erreur 502 se produira.
echo "program start..."; file_put_contents('/tmp/garylog.log','start-time:'.date('Y-m-d H:i:s')."\n", 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.',时间'.date('Y-m-d H:i:s')."\n", FILE_APPEND); sleep(10); file_put_contents('/tmp/garylog.log', 'end-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND);
Exécuter le test
Compatible avec non-php-fpm
En termes de portabilité du code, vous pouvez joindre le code suivant au code :
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }
Ne causera pas de problèmes de déploiement de code dans des environnements non fpm.
Pour le problème mentionné ci-dessus : temps d'exécution excessif sous concurrence élevée Pendant longtemps, cela rendra également le processus fastcgi insuffisant et incapable d'être publié à temps. Dans le même temps, notre exigence concerne uniquement le déclenchement et n'a pas besoin d'être exécuté à chaque fois. Nous pouvons alors envisager d'utiliser la méthode suivante pour éviter de dupliquer le processus.
$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 需要长时间处理的代码 //处理完成后删除进程id记录文件 unlink($file);
Recommandations associées :
Le fastcgi_finish_request magique en php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!