php - tutorial - queue laravel database
Laravel 4 Queue: escuchar tiempos de espera (8)
php artisan queue:listen
y después de aproximadamente 27 minutos, deja de procesar más trabajos. En mi registro de errores, veo el error:
exception ''Symfony/Component/Process/Exception/RuntimeException'' with message ''The process timed out.'' in /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php:413
Stack trace:
#0 /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php(201): Symfony/Component/Process/Process->wait(NULL)
#1 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(63): Symfony/Component/Process/Process->run()
#2 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(50): Illuminate/Queue/Listener->runProcess(Object(Symfony/Component/Process/Process), 128)
#3 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php(69): Illuminate/Queue/Listener->listen(NULL, ''default'', 0, 128, 60)
#4 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(108): Illuminate/Queue/Console/ListenCommand->fire()
#5 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(240): Illuminate/Console/Command->execute(Object(Symfony/Component/Console/Input/ArgvInput), Object(Symfony/Component/Console/Output/ConsoleOutput))
#6 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(96): Symfony/Component/Console/Command/Command->run(Object(Symfony/Component/Console/Input/ArgvInput), Object(Symfony/Component/Console/Output/ConsoleOutput))
#7 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(193): Illuminate/Console/Command->run(Object(Symfony/Component/Console/Input/ArgvInput), Object(Symfony/Component/Console/Output/ConsoleOutput))
#8 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(106): Symfony/Component/Console/Application->doRun(Object(Symfony/Component/Console/Input/ArgvInput), Object(Symfony/Component/Console/Output/ConsoleOutput))
#9 /var/www/l4site/artisan(59): Symfony/Component/Console/Application->run()
#10 {main}
¿Es esto un error? ¡No creo que se suponga que el oyente debe esperar!
Actualizar
Una segunda ejecución del oyente se agotó después de 3 horas. Estoy ejecutando Laravel 4 en nginx con php-fgm.
El siguiente comando funcionó como un amuleto. Ha estado funcionando toda la noche ahora (más de 12 horas).
php artisan queue:listen --timeout=0
Gracias a timgws respuesta.
El problema es que hay un límite de tiempo.
Cambia el límite de tiempo y el problema resuelto.
set_time_limit (howmanysecondsyouneed)
http://php.net/manual/en/function.set-time-limit.php
No creo que el oyente esté agotando el tiempo, creo que el proceso que intenta ejecutar se está agotando. Esa excepción proviene de Symfony / Component / Process . Lamentablemente, el código de proceso en sí está un poco sobre mi cabeza por hoy.
solo ejecute COMPOSER_PROCESS_TIMEOUT = 4000 php artisan queue: listen
Ni el proceso tampoco el artesano está agotando el tiempo. es la envoltura del proceso. Symfony / Component / Process / Process Class se utiliza para ejecutar cualquier proceso (en mi caso Knp / Bundle / SnappyBundle / Snappy / LoggableGenerator el paquete que imprime archivos PDF con wkhtmltoPDF está condicionado a que wkhtmltoPDF haya agotado el tiempo de espera porque estoy procesando un PDF con 11000 páginas, solo necesita más tiempo)
No tiene nada que ver con max_execution_time = XXX de php.ini (ya que es una excepción lanzada por la instancia de Symfony Process con un mensaje confuso)
Debes lograr pasar por las relaciones de objeto para llamar
Symfony/Component/Process/Process->setTimeout(null)
Esto resuelve el problema. En mi caso:
$knp = $this->getContainer()->get(''knp_snappy.pdf'');
/* @var $knp /Knp/Bundle/SnappyBundle/Snappy/LoggableGenerator */
$knp->getInternalGenerator()->setTimeout(null);
$pdf = $knp->getOutputFromHtml($this->view, $printOptions);
queue:listen
en Laravel 4 tiene una opción --timeout
. Si desea un tiempo de espera ilimitado, debe establecer la opción --timeout en 0.
./artisan queue:listen --timeout=0
¿Ha considerado usar supervisord para asegurarse de que su proceso siga funcionando? Con supervisord instalado en caso de que su proceso fallezca por algún motivo, este daemon lo volverá a iniciar. La empresa para la que trabajo lo ha estado usando junto con la cola: escuche por un tiempo.
Independientemente de cuánto tiempo tenga configurado, eventualmente se quedará sin memoria o sin tiempo de espera. Puedes usar el supervisor para mantenerlo funcionando. Es realmente simple de usar.
Primero, instálalo :
sudo apt-get install supervisor
o use un método listado en su sitio como easy_install http://supervisord.org/installing.html
Ahora agregue un archivo de configuración para el supervisor. Abre /etc/supervisor/conf.d/queue.conf
(o lo que quieras para ponerle nombre al archivo pero ponlo en /etc/supervisor/conf.d/
) y agrega:
[program:queue]
command=php artisan queue:listen
directory=/var/www/laravel
stdout_logfile=/var/www/laravel/app/storage/logs/supervisor_queue_listener.log
redirect_stderr=true
Explicación de lo anterior: program:_____
es cómo nombramos lo que se ejecuta. Lo haremos referencia más adelante. command
es el comando que desea ejecutar. directory
donde se debe ejecutar. En mi caso, estoy en un proyecto llamado "laravel". stdout_logfile
es el archivo donde desea redireccionar el stdout que se recibe del comando. redirect_stderr
se establece en verdadero para dirigir todos los errores al mismo registro especificado en stdout_logfile
. También puede configurarlos para ir a su propio archivo de registro.
Controlador de supervisor abierto :
sudo supervisorctl
Lea el contenido del directorio /etc/supervisor/conf.d/
: (mientras aún está en supervisorctrl)
reread
Agregue el programa de cola al supervisor :
add queue
Eso es. Ahora debería estar funcionando. Si tiene errores, busque en su archivo de registro para ver qué está mal.
Una vez que reinicie su servidor, tendrá que volver a iniciar el supervisor con el sudo service supervisor start
.
Laracasts cubre a Supervisor realmente bien. Si no estás suscrito a Laracasts, lo recomiendo encarecidamente.