2017-03-03 147 views
0

後,我有這樣的工作:Laravel隊列重新啓動60秒

//Run very intensive script that generates files 
//Notify the user that the job is done 

我知道腳本需要4-5分鐘即可運行,因爲它是生成的所有文件所需要的時間。 然而,正好60秒後,作業被刪除(即我沒有在我的jobs數據庫表中看到它)並且用戶得到通知。然後,每60秒,直到腳本完成,用戶會收到通知,表示該作業已完成。

作業不會失敗。該作業僅在jobs表中前60秒出現。文件生成腳本只運行一次。

我用導師:

[program:queue] 
process_name=%(program_name)s_%(process_num)02d 
command=php artisan queue:work --timeout=600 --queue=high,low 
user=forge 
numprocs=8 
directory=/home/forge/default 
stdout_logfile=/home/forge/default/storage/logs/supervisor.log 
redirect_stderr=true 

這裏是我的數據庫配置:

'database' => [ 
      'driver' => 'database', 
      'table' => 'jobs', 
      'queue' => 'low', 
      'expire' => 600, 
     ], 

的行爲是相同的,如果我使用Redis的

'redis' => [ 
      'driver' => 'redis', 
      'connection' => 'default', 
      'queue' => 'low', 
      'expire' => 600, 
     ], 

回答

3

你的配置是稍微偏離。我不確定expire從哪裏來,但我相信你的意思是retry_after。由於您的配置未在鍵後定義retry_after,因此Laravel將該值默認爲60秒。因此,您的隊列在運行60秒後正在處理作業,並將其重新排隊以再次嘗試。

此外,下面的說明是from the documentation

--timeout值應始終比你retry_after配置值至少短几秒鐘。這將確保處理給定作業的工作人員在作業重試之前總是被殺死。如果您的--timeout選項長於retry_after配置值,則您的作業可能會被處理兩次。

所以,如果您的隊列工作超時將是600,我建議你retry_after設定爲至少610

+1

哇...我怎麼會錯過呢?非常感謝! – Wistar