Un script PHP cesse-t-il de s'exécuter lorsque vous recevez le délai d'expiration de la passerelle 504?

8

Je suis sur un serveur partagé (Siteground), et comme mon script PHP WordPress prend plus de 30 secondes, il renvoie un délai d'expiration de la passerelle 504.

Ma requête sera-t-elle exécutée et terminée si elle ne rencontre pas d'autre erreur?

Edit: J'ai demandé pourquoi j'ai reçu cette erreur à mon équipe d'hébergement, ici l'expert d'hébergement Siteground a expliqué le problème comme suit:

Nous utilisons à la fois Apache + Nginx sur tous nos serveurs. Apache est utilisé pour le service Web principal, tandis que Nginx est utilisé comme proxy inverse et cache de distribution. Lorsque la réponse ne peut pas être servie à partir du cache (généralement cela fait référence au contenu dynamique), une demande de Nginx est effectuée vers Apache. Ceci lorsque Apache traite la demande, la transmet à votre site Web et selon la logique PHP, des requêtes MySQL peuvent être effectuées ou d'autres données récupérées. Lorsque ce processus prend trop de temps et qu'Apache ne renvoie pas la réponse en temps opportun à Nginx, vous verrez cette erreur. En bref, Apache ne peut pas gérer la demande car l'application a terminé le processus dans le délai imparti. Cela signifie également que le processus initié ne s'est probablement pas entièrement terminé et que certaines données / actions peuvent avoir été enregistrées / exécutées.

L'expert dit que "initiated process most probably not completed fully",

Plus de détails sur mon scénario: mon script ajoute des produits de woocommerce avec des variantes en utilisant la wp_insert_postméthode à mon site web wordpress. Une fois les produits ajoutés, il affiche les images des nouveaux produits ajoutés.

Lorsque j'ajoute 1 produit (40 variantes), il se termine et affiche l'image du produit. Lorsque j'ajoute 6 produits (240 variantes), je reçois une erreur directement dans mon navigateur.

Donc, pour tester davantage ce problème, j'ai modifié mon code et l'ai réécrit en utilisant ajax et j'ai ajouté une barre de processus comme le système. (Qui incrémente un nombre pour chaque variation).

Après avoir exécuté le code pour 1 produit (avec 40 variantes), le nombre de processus augmente à 40 et affiche l'image du produit.

Lorsque j'exécute mon code pour 6 produits, le nombre de processus augmente à 240, mais il n'affiche rien, et lorsque je vérifie, il reçoit une erreur 504. ( jQuery.Ajaxsection d'erreur de fonction)

Cela me fait donc penser que la requête s'exécute même en cas de dépassement de délai, mais je ne suis toujours pas en mesure d'être sûr et de rechercher des détails après l'erreur de délai d'expiration de la passerelle 504 car il n'y a pas de bonne documentation à ce sujet.

HOY
la source
1
Cela peut dépendre de la provenance du délai d'expiration de la passerelle. C'est une question intéressante.
Stephen Ostermiller
@StephenOstermiller a ajouté plus de détails en fonction de votre commentaire.
HOY
Vraisemblablement, vous saurez si le script s'est terminé si tous les "6 produits (240 variantes)" ont été ajoutés à votre site Web? Ou est-ce difficile à déterminer? Peut-être ajouter une fonctionnalité de journalisation à votre script?
MrWhite

Réponses:

3

Le script n'arrêtera pas son exécution jusqu'à ce qu'il atteigne le délai d'expiration php lui-même.

L'erreur 504 est générée sur la passerelle / proxy elle-même, elle ne provient pas du processus php.

C'est parce que cela, si vous avez un Apache avec Apache-mod-php, vous ne recevrez jamais cette erreur, car il n'y a pas de proxy.

En étendant l'explication, pensez comme suit:

Vous avez un processus PHP. Le processus PHP peut être un PHP-FPM, PHP-CGI ou Apache-MOD-PHP. Sur ce processus, vous avez un timeout (configuré sur php.ini ou avec un ini_set).

Le proxy PHP donne une réponse dans le temps imparti (aka: si vous avez un set_time_limit (600), votre processus PHP peut durer jusqu'à 10 minutes).

Sans relation sur cette phrase, vous pouvez avoir un autre processus en attente de ces réponses: c'est le cas d'un apache (configuré pour contacter php par cgi ou fpm), un nginx, un lighthttpd et autres. Ce n'est pas le cas d'un apache configuré par apache-mod-php. Ce deuxième processus, a un nouveau délai d'expiration (proxy_timeout), configuré sur la configuration de l'application vhost / general server. C'est le temps pendant lequel le programme attendra une réponse du moteur de traitement PHP.

La dernière phrase peut être répétée sur chaque proxy / passerelle.

Pensez à ce scénario:

haproxy (Timeout 1) -> Nginx (Frontend / cache) (Timeout 2) -> Apache (Timeout 3) -> PHP-FPM (PHP Timeout / set_time_limit).

Et un scénario très simple:

Apache (avec apache-mod-php) (PHP Timeout / set_time_limit).

Chaque apparence de délai d'expiration (à l'exception du délai d'expiration PHP lui-même) est une origine probable d'une erreur de délai d'expiration de la passerelle HTTP 504.

Sakura Kinomoto
la source
"si vous avez un Apache avec Apache-mod-php, vous ne recevrez jamais cette erreur" - pouvez-vous expliquer cette dernière phrase?
MrWhite
Lorsque vous utilisez un serveur Apache avec mod-php, l'exécution a été effectuée par Apache lui-même. Parce que cela, vous ne pouvez pas obtenir un délai d'expiration 504, car il n'y a pas de passerelle sur le processus. Si vous utilisez php-cgi ou php-fpm, Apache / nginx / un autre serveur Web agissent comme un proxy ou une passerelle vers le moteur de traitement réel. Ensuite, une erreur 504 apparaît lorsque cette passerelle n'a pas reçu de réponse dans un laps de temps configuré.
Sakura Kinomoto
Mais ne pouvez-vous pas avoir un proxy inverse Nginx devant Apache mod-php?
MrWhite
Évidemment, mais ce n'est pas la question elle-même. Dans ce cas, 504 peut être donné par nginx, mais pas par Apache. La question dans ce cas est de savoir qui, si le code d'erreur 504 est généré par le proxy, l'exécution déclenchée par l'appel proxy n'est pas arrêtée. Dans le cas d'une passerelle ou d'un proxy, il y a au moins deux temporisateurs en jeu. Le timeout de la communication proxy (sur nginx par exemple) et le timeout sur le processus php.
Sakura Kinomoto
Je comprends. Mais votre dernière phrase semble incomplète dans ce cas, car elle implique que le simple fait d'utiliser Apache-mod-php (qu'il existe ou non un proxy frontal) éviterait cette erreur. Je suppose que vous voulez dire ... « si vous ne disposez d' un Apache avec Apache-mod-php et pas de proxy front-end (Nginx dans ce cas) , alors vous ne recevrez jamais cette erreur »?
MrWhite