Maison >développement back-end >tutoriel php >Introduction à fastcgi_finish_request en php et son code non bloquant

Introduction à fastcgi_finish_request en php et son code non bloquant

不言
不言original
2018-08-25 17:21:123484parcourir

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.

Avant-propos

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.

Application de base

Introduction à fastcgi_finish_request

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

Valeur de retour

Renvoie VRAI en cas de succès, ou FAUX en cas d'échec

Remarques

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

Appliquer

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

Introduction à fastcgi_finish_request en php et son code non bloquant

Introduction à fastcgi_finish_request en php et son code non bloquant

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.

Assurez-vous que le processus s'exécute en un seul processus

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

PHP utilise la fonction fastcgi_finish_request() pour implémenter opérations asynchrones, améliorez la vitesse de réponse

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!

Déclaration:
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

Articles Liés

Voir plus