Error de tiempo de espera del proceso de cola de Laravel

5 minutos de lectura

Estoy en Laravel usando php artisan queue:listen para ejecutar trabajos en cola. Uno de estos trabajos es bastante complicado y lleva mucho tiempo, por lo que recibo el siguiente error:

[Symfony\Component\Process\Exception\ProcessTimedOutException]                                                                                                                                                                              
The process ""/usr/local/Cellar/php55/5.5.14/bin/php" artisan queue:work  
--queue="QUEUE_URL" --delay=0 --memory=128 --sleep=3 --tries=0" 
exceeded the timeout of 60 seconds.

Sé que podría correr queue:listen con un valor de tiempo de espera arbitrariamente alto, pero eso no es ideal, como yo hacer desea que se agote el tiempo de espera en caso de que algún proceso esté Realmente no responde Traté de llamar regularmente set_time_limit(60) dentro de la función llamada por el trabajo, pero eso no resolvió mi problema.

Encontré un hilo en línea mencionando Symfony\Component\Process\Process->setTimeout(null)pero no sé cómo acceder a ese objeto de proceso, o si eso solucionaría el problema.

Cualquier ayuda sería muy apreciada.

  • ¿Has probado php craft queue: listen –timeout=120? No veo la necesidad de reinventar la rueda si solo necesita extender el tiempo que su cola debe funcionar. Si necesita más de 5 minutos, es posible que deba publicar el método real que maneja los trabajos en cola.

    – comiendo la noche

    16/09/2014 a las 20:34

  • Como dije, queue:listen –timeout={number} funciona, pero la tarea particular que estoy ejecutando puede tomar desde unos pocos segundos hasta una hora o más, y no quiero poner un tiempo de espera ridículamente alto. valor.

    – Will Durney

    16/09/2014 a las 21:37

  • ¿Qué causa la variación? este es un problema con la estructura de su aplicación. Para ayudar con este problema, necesitamos ver el código para que podamos optimizarlo mejor para los casos en los que tiene que analizar muchos datos. Esto debe dividirse en más puestos de trabajo.

    – comiendo la noche

    16/09/2014 a las 23:21

  • El trabajo particular que causa problemas es un algoritmo O (n ^ 2) que se ejecuta en una entrada grande. Imponemos un límite estricto en el tamaño de entrada para que sea razonable, pero la verdad es que es solo un proceso que puede llevar mucho tiempo. Estamos usando una cola de trabajo para procesarlo en segundo plano y, cuando termina, realiza una solicitud http a nuestra API para indicar que se completó. ¿Hay una mejor manera de hacer algo como esto? ¿Dividir el procesamiento en muchos trabajos? Eso parece demasiado complicado, ya que es un algoritmo único que debe ejecutarse en los datos. No entiendo por qué set_time_limit no funciona.

    – Will Durney

    17 de septiembre de 2014 a las 4:37

  • Lo volvería a escribir en otro idioma, como un microservicio, haría que expusiera una API HTTP y publicara los datos a través de HTTP, luego puede notificar a su aplicación existente cuando esté completa. Golang o Node suenan más apropiados. PHP realmente no está hecho para ese tipo de trabajo pesado.

    – Andrew McLagan

    04/12/2016 a las 22:33

agregando --timeout=0 funcionó para mi configuración.

ACTUALIZAR:
Por lo tanto, todo el comando sería php artisan queue:listen --timeout=0.

Espero que esto ayude.

  • Nota al margen para otros usuarios: puede ser peligroso establecer el tiempo de espera en 0, puede resultar en un bucle infinito “invisible”. Tal vez use algo “razonable” como 120.

    – rap-2-h

    9 de septiembre de 2015 a las 15:08

  • ¿Hay alguna otra manera? El punto @ rap-2-h es válido, pero mi problema es que en mi secuencia de comandos estoy haciendo un trabajo muy extenso que puede durar más de 24 horas. Cualquier solución para esto.

    – Rizh

    22 de octubre de 2016 a las 9:55


  • @Rizh Entonces diría que hay algo mal con su diseño. Nunca debe confiar en procesos que necesitan ejecutarse durante tanto tiempo antes de que hagan algo. Descomponerlo en componentes más pequeños.

    – ankush981

    13 de enero de 2017 a las 18:15

  • Gracias, es lo que necesitaba para ejecutar xdebug normalmente. De alguna manera, el script siempre fallaba para mí…

    – Mārtiņš Briedis

    2 de marzo de 2017 a las 16:36

  • He estado buscando el código fuente y la documentación de Laravel y no puedo ver nada que indique que un 0 el valor en el tiempo de espera es infinito. De hecho, tuvimos un problema al seguir la idea de que sí y teníamos scripts que se agotaban en el tiempo de espera predeterminado y no llegaban a infinito. ¿Alguien puede señalarme en qué parte del código fuente o la documentación respalda esta teoría? laravel.com/docs/8.x/queues#timeout

    – Decano Casa Blanca

    15 de abril de 2021 a las 13:36

avatar de usuario
Anmol Mourya

Después de invertir mucho tiempo obtuve la solución.

Agregue la siguiente línea en la clase de trabajo y su trabajo se ejecutará sin tiempo de espera, incluso si coloca el trabajo en una entrada crontab

public $timeout = 0;

  • Eso ayudó mucho gracias!

    – Miguel

    8 de febrero a las 13:19

Este es un conocido insecto en Laravel v5.3:

Debe actualizar a v5.5 para solucionar este problema.

Otra forma es hackear el código fuente como se explica aquí

  • “Hackear el código fuente” nunca es una buena idea, pero como esta pregunta tiene más de tres años y tiene una respuesta aceptada, ¿cuál es tu punto?

    –Nico Haase

    1 de enero de 2018 a las 9:51

  • ¡Sí! Hackear el código fuente nunca es una buena idea, pero es mejor que –timeout=0

    – Mostafá Lavaei

    3 de enero de 2018 a las 4:30

  • ¿Por qué piratear el código fuente de otras personas debería ser una mejor opción que configurar una opción durante el tiempo de llamada que se creó solo para ese propósito?

    –Nico Haase

    3 de enero de 2018 a las 8:09

  • Porque –timeout=0 puede causar un proceso infinito. Esto no es realmente piratería, es solo una actualización que se realizó en v5.5

    – Mostafá Lavaei

    8 de enero de 2018 a las 10:55

Se realiza una cola principalmente para las solicitudes que toman mucho tiempo para completar el envío de correo masivo, los trabajos de cola de importación de datos se ejecutan en segundo plano. mejora nuestro rendimiento de la aplicación web también. Si no configuramos el tiempo de espera, toma por defecto 60 segundos. el intervalo de tiempo y si configuramos el tiempo de espera como 0, significa que configuramos un tiempo de espera infinito, la solicitud se ejecuta continuamente hasta que no se completa. Para configurar el tiempo de espera, tenemos que ejecutar este comando: php craft queue: listen –timeout=0

Aquí está el enlace de referencia del documento oficial: https://laravel.com/docs/8.x/queues

¿Ha sido útil esta solución?