web-dev-qa-db-fra.com

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

Je suis sur un serveur partagé (Siteground) et, comme mon script WordPress PHP 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 complétée si elle ne rencontre pas d'erreur supplémentaire?

Edit: J'ai demandé pourquoi j'ai reçu cette erreur à mon équipe d'hébergement, voici l'expert en hébergement de Siteground qui a expliqué le problème de la manière suivante:

Nous utilisons les deux Apache + Nginx sur tous nos serveurs. Apache est utilisé pour le service Web principal, tandis que Nginx est utilisé en tant que proxy inverse et distribue le cache. Lorsque la réponse ne peut pas être servie à partir du cache (il s’agit généralement d’un contenu dynamique), une requête de Nginx est adressée à Apache. Ceci lorsque Apache traite la demande, la transfère sur votre site Web et conformément à 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 à Nginx dans les délais impartis, vous verrez cette erreur. En bref, Apache ne peut pas traiter la requête car l'application a terminé le processus dans les délais impartis. Cela signifie également que le processus lancé n'a probablement pas abouti 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 woocommerce avec des variantes en utilisant la méthode wp_insert_post sur 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 complète 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 plus avant ce problème, j'ai modifié mon code, je l'ai réécrit en utilisant ajax et j'ai ajouté une barre de processus comme 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 passe à 40 et affiche l'image du produit.

Lorsque j'exécute mon code pour 6 produits, le numéro de processus augmente à 240, mais rien n'a été affiché. Lorsque je vérifie, une erreur 504 s'affiche. (jQuery.Ajax section d'erreur de fonction)

Cela me fait donc penser que la requête est exécutée même si elle a dépassé le délai imparti, mais je ne peux toujours pas en être sûr et je recherche des détails au sujet de l'erreur de dépassement de délai de la passerelle 504 car il n'y a pas de bonne documentation à ce sujet.

8
HOY

Le script n'arrêtera pas l'exécution tant qu'il n'aura pas atteint le délai d'attente php.

Les erreurs 504 sont générées sur la passerelle/proxy elle-même, cela ne provient pas du processus php.

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

En prolongeant l'explication, pensez comme suit:

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

Le proxy PHP donne une réponse dans le temps imparti (si vous avez 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 cette réponse: C'est le cas d'un Apache (configuré pour contacter php par cgi ou fpm), d'un nginx, d'un lighthttpd, etc. Ce n'est pas le cas d'un Apache configuré par Apache-mod-php. Ce second processus a un nouveau délai d'expiration (proxy_timeout), configuré sur la configuration de l'application serveur vhost/general. C’est à ce moment-là que 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 (Délai PHP/set_time_limit).

Et un scénario très simple:

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

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

2
Sakura Kinomoto

Si j'ai bien compris, le script continue de s'exécuter, mais arrête de transmettre les données au client. (Ce n'est pas que j'ai les connaissances nécessaires pour l'expliquer.) Voici un article qui peut aider:

Comment réparer une erreur de timeout de la passerelle 504 dans WordPress

1
elbrant