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_post
mé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.Ajax
section 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.
Réponses:
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.
la source
Ma compréhension est que le script continue de s'exécuter, mais cesse de rapporter des données au client. (Pas que j'ai les connaissances nécessaires pour l'expliquer.) Voici un article qui peut vous aider:
Comment réparer une erreur de délai d'expiration de la passerelle 504 dans WordPress
la source