2015-12-28 11 views
5

La situazionePerché i miei processi di coda di laravel falliscono dopo 60 secondi?

sto usando laravel code di elaborare grandi quantità di file multimediali, un singolo lavoro dovrebbe prendere minuti (lascia solo dire che fino a un'ora).

Sto utilizzando Supervisor per eseguire la mia coda e sto eseguendo 20 processi alla volta. Il mio file di configurazione supervisore si presenta così:

[program:duplitron-worker] 
process_name=%(program_name)s_%(process_num)02d 
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1 
autostart=true 
autorestart=true 
user=duplitron 
numprocs=20 
redirect_stderr=true 
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log 

Ci sono alcune stranezze che non so come spiegare o correggere:

  1. I miei lavori abbastanza sistematicamente, non dopo l'esecuzione per 60 a 65 secondi .
  2. Dopo essere stato contrassegnato come non riuscito, il lavoro continua a essere in esecuzione anche dopo essere stato contrassegnato come non riuscito. Alla fine finiscono per risolversi con successo.
  3. Quando I run the failed task in isolation trovare la causa del problema, ha esito positivo.

Credo fermamente che si tratti di un problema di timeout; tuttavia, avevo l'impressione che lo --timeout=0 risultasse in un timeout illimitato.

La questione

Come posso impedire questo "fallimento" stato di lavoro temporaneo? Ci sono altri posti in cui può essere invocato un timeout della coda di cui non sono a conoscenza?

+1

Controllare la 'max_execution_time' tuo php.ini Quanto si dice? Se è 60 secondi, c'è il tuo problema. prova ad aumentare il timeout. –

+0

Grande pensiero @WillyPt - le impostazioni di php.ini non terminerebbero l'intero script, comunque? Continua a risolversi. (FWIW 'max_execution_time' era impostato su 30s, esplorerò e sperimenterò su queste linee). – slifty

risposta

10

Risulta che oltre al timeout c'è un expire impostazione definita nel config/queue.php

'database' => [ 
     'driver' => 'database', 
     'table' => 'jobs', 
     'queue' => 'default', 
     'expire' => 60, 
    ], 

Cambiare che un valore superiore fatto il trucco.

2

Nota importante: "scadono" è ora chiamato "retry_after" (laravel 5.4)