2014-09-16 11 views
24

Sono su Laravel utilizzando php artisan queue:listen per eseguire lavori in coda. Uno di questi posti di lavoro è abbastanza coinvolto e richiede molto tempo, e così sto ottenendo il seguente errore:Errore di timeout del processo di coda di laravel

[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. 

So che avrei potuto correre queue:listen con un valore arbitrariamente elevato di timeout, ma che non è l'ideale, come I do desidera che scada nel caso in cui un processo sia in realtà non rispondente. Ho provato a chiamare regolarmente set_time_limit(60) all'interno della funzione chiamata dal lavoro, ma questo non risolveva il mio problema.

Ho trovato un thread in linea che menziona Symfony\Component\Process\Process->setTimeout(null), ma non so come accedere a tale processo oggetto, o se questo potrebbe anche risolvere il problema.

Qualsiasi aiuto sarebbe molto apprezzato.

+1

Hai provato coda php artigianale: ascolta --timeout = 120. Non vedo alcuna necessità di reinventare la ruota se hai solo bisogno di estendere il tempo che la tua coda deve correre. Se è necessario più di 5 minuti circa, potrebbe essere necessario pubblicare il metodo effettivo che gestisce i lavori in coda. – mschuett

+0

Come ho detto, coda: listen --timeout = {number} funziona, ma il particolare compito che sto eseguendo potrebbe richiedere da pochi secondi a un'ora o più, e non voglio mettere un ridicolo alto valore di timeout. –

+0

cosa causa la varianza? questo è un problema con il modo in cui la tua applicazione è strutturata. Per aiutare con questo problema, dobbiamo vedere il codice in modo da poter ottimizzare al meglio i casi quando devi analizzare molti dati. Questo deve essere suddiviso in più posti di lavoro. – mschuett

risposta

38

L'aggiunta di --timeout=0 ha funzionato per il mio set up.

UPDATE: L'intero comando sarebbe quindi php artisan queue:listen --timeout=0.

Spero che questo aiuti.

+12

Nota a margine per altri utenti: può essere pericoloso impostare il timeout su 0, può risultare su un loop infinito "invisibile". Forse usare qualcosa di "ragionevole" come 120. –

+0

c'è qualche altro modo? @ rap-2-h point è valido ma il mio problema è che nella mia sceneggiatura sto facendo un lavoro molto esteso che può durare più di 24 ore. Qualsiasi soluzione per questo. – Rizh

+1

@Rizh Quindi direi che c'è qualcosa di sbagliato nel tuo progetto. Non dovresti mai fare affidamento su processi che devono essere eseguiti per così tanto tempo prima che facciano qualcosa. Scomposizione in componenti più piccoli. – dotslash

1

Si tratta di un noto bug in laravel v5.3:

Si dovrebbe eseguire l'aggiornamento a v5.5 per risolvere questo problema.

Un altro modo è hacking del codice sorgente, come spiegato here

+0

"Hacking the source code" non è mai una buona idea, ma visto che questa domanda ha più di tre anni e ha una risposta accettata, dov'è il tuo punto? –

+0

Sì! L'hacking del codice sorgente non è mai una buona idea, ma è meglio di --timeout = 0 –

+0

Perché l'hacking del codice sorgente di altre persone è un'opzione migliore rispetto all'impostazione di un'opzione durante il tempo di chiamata creato proprio a tale scopo? –