Estoy en un servidor compartido (Siteground), y dado que mi script PHP de WordPress tarda más de 30 segundos, devuelve un tiempo de espera de 504 Gateway.
¿Mi consulta se ejecutará y completará si no encuentra un error adicional?
Editar: pregunté por qué recibí este error a mi equipo de alojamiento, aquí el experto en alojamiento de Siteground explicó el problema de la siguiente manera:
Usamos Apache + Nginx en todos nuestros servidores. Apache se usa para el servicio web principal, mientras que el Nginx se usa como proxy inverso y caché de distribución. Cuando la respuesta no se puede servir desde el caché (generalmente esto se refiere al contenido dinámico), se realiza una solicitud de Nginx hacia Apache. Esto cuando Apache procesa la solicitud, la reenvía a su sitio web y de acuerdo con la lógica de PHP, se pueden realizar consultas MySQL u otros datos recuperados. Cuando este proceso lleva demasiado tiempo y Apache no devuelve la respuesta de manera oportuna a Nginx, verá este error. En resumen, Apache no puede atender la solicitud ya que la aplicación completó el proceso dentro del tiempo permitido. Esto también significa que el proceso iniciado probablemente no se completó completamente y algunos datos / acciones podrían haberse guardado / ejecutado.
El experto dice que "initiated process most probably not completed fully"
,
Más detalles sobre mi escenario: mi script agrega productos de WooCommerce con variaciones utilizando el wp_insert_post
método a mi sitio web de WordPress. Después de agregar productos, muestra las imágenes de los productos recién agregados.
Cuando agrego 1 producto (40 variaciones), se completa y muestra la imagen del producto. Cuando agrego 6 productos (240 variaciones), recibo un error directamente en mi navegador.
Entonces, para probar aún más este problema, modifiqué mi código y lo reescribí usando ajax y agregué una barra de proceso como sistema. (Que incrementa un número para cada variación).
Después de ejecutar el código para 1 producto (con 40 variaciones), el número de proceso aumenta a 40 y muestra la imagen del producto.
Cuando ejecuto mi código para 6 productos, el número de proceso aumenta a 240, pero no muestra nada, y cuando verifico, recibe un error 504. ( jQuery.Ajax
sección de error de función)
Entonces, esto me hace pensar que la consulta se ejecuta incluso cuando se agota el tiempo de espera, pero aún no puedo estar seguro, y estoy buscando detalles detrás del error de tiempo de espera de la puerta de enlace 504 ya que no hay buena documentación al respecto.
Respuestas:
El script no dejará de ejecutarse hasta que alcance el tiempo de espera de php.
El error 504 se genera en la puerta de enlace / proxy en sí, no proviene del proceso php.
Esto se debe a que si tiene un Apache con Apache-mod-php, nunca recibirá este error, porque no hay un proxy.
Extendiendo la explicación, piense de la siguiente manera:
Tienes un proceso PHP. El proceso PHP puede ser un PHP-FPM, PHP-CGI o Apache-MOD-PHP. En este proceso, tiene un tiempo de espera (configurado en php.ini o con un ini_set).
El proxy PHP da una respuesta en el tiempo permitido (también conocido como: si tiene un set_time_limit (600), su proceso PHP puede estar ejecutándose hasta 10 minutos).
Sin relación con esta oración, puede tener otro proceso esperando esta respuesta: ese es el caso de un apache (configurado para contactar a php por cgi o fpm), un nginx, un lighthttpd y otros. Ese no es el caso de un apache configurado por apache-mod-php. Este segundo proceso tiene un nuevo tiempo de espera (proxy_timeout), configurado en la configuración de la aplicación vhost / servidor general. Es el momento en que el programa esperará una respuesta del motor de procesamiento de PHP.
La última oración se puede repetir en cada proxy / gateway.
Piensa en este escenario:
haproxy (Tiempo de espera 1) -> Nginx (Frontend / caché) (Tiempo de espera 2) -> Apache (Tiempo de espera 3) -> PHP-FPM (Tiempo de espera de PHP / set_time_limit).
Y un escenario muy simple:
Apache (con apache-mod-php) (Tiempo de espera de PHP / set_time_limit).
Cada aparición de tiempo de espera (excepto el tiempo de espera de PHP en sí) es un origen probable de un error de tiempo de espera de la puerta de enlace 504 HTTP.
fuente
Tengo entendido que el script continúa ejecutándose, pero deja de informar datos al cliente. (No es que tenga el conocimiento para explicarlo). Aquí hay un artículo que puede ayudar:
Cómo arreglar un error de tiempo de espera de puerta de enlace 504 en WordPress
fuente