web-dev-qa-db-fra.com

Une erreur de délai d'attente de la passerelle 504 signifie-t-elle qu'un serveur est tombé en panne?

J'exécute un script php sur un site Web qui crée des vignettes à partir d'une grande image. Le script utilise imagick pour générer 10 vignettes par image.
Il s'exécute au chargement de la première page, lorsque les vignettes n'existent pas encore et peut éventuellement être invité à générer des centaines de vignettes lors du chargement de la première page. Cela prend du temps (environ 2,5 secondes par lot de 10 vignettes) et le serveur renvoie donc une erreur 504 Timeout de la passerelle .

Cette erreur signifie:

Le serveur, tout en agissant en tant que passerelle ou proxy, n'a pas reçu de réponse rapide du serveur en amont spécifié par l'URI ... [ source ]

Ce que je peux comprendre, car le script php peut durer 60 secondes ou plus.

Ma question est la suivante: Cela signifie-t-il que le script a planté le serveur et qu'il s'est arrêté au cours de son exécution?
Ou cela signifie-t-il simplement que mon navigateur est trop impatient d'attendre la réponse du serveur?

Mon souci principal est que le script se crache pendant la génération de vignettes et puisse potentiellement générer des fichiers corrompus.

1
web-tiki

Une erreur de délai d'attente de la passerelle ne signifie généralement pas que votre serveur est tombé en panne. Les navigateurs ne génèrent pas non plus ces erreurs. Cela signifie qu'un serveur intermédiaire en a eu assez d'attendre votre serveur principal.

Lorsque vous obtenez ces erreurs, cela signifie généralement qu'un serveur proxy est impliqué. Vous pourriez avoir un proxy inverse d'un port à un autre. Vous utilisez peut-être un CDN ou un équilibreur de charge.

Vous devriez vous inquiéter des fichiers corrompus. Générer des fichiers au premier chargement n'est généralement pas un bon plan. La plupart des demandes de limite de temps avant que le serveur Web ne supprime le processus. Par exemple, si vous démarrez ce processus via PHP, vous devrez définir un paramètre suffisamment long http://php.net/manual/en/function.set-time-limit.php

Vous devez également prendre en compte une condition de concurrence critique. Que se passe-t-il lorsqu'une deuxième demande arrive alors que la première est en cours de traitement? Est-ce que cela génère aussi des images? Deux processus essayant d'écrire des images aux mêmes emplacements peuvent provoquer une corruption.

Les tâches qui prennent plus de quelques secondes doivent être traitées différemment. Vous avez quelques options. Vous pouvez les exécuter de manière asynchrone et demander aux requêtes Web de vérifier l'état. Vous pouvez redimensionner les images après leur téléchargement ou dans le cadre du déploiement du site Web. Vous pouvez avoir un travail cron qui vérifie périodiquement si les images doivent être redimensionnées.

1