Laravel定時(shí)任務(wù)執(zhí)行的命令的時(shí)間不確定,我根據(jù)文檔添加了withoutOverlapping(),但是好像沒有生效
開發(fā)環(huán)境:windows 10, laradock ,Laravel 5.4.36
相關(guān)代碼
kernel的代碼
$schedule->command('produce:email')->withoutOverlapping();
命令的代碼
public function handle()
{
$name = mt_rand(10000,99999);
Log::info($name . ':開始運(yùn)行時(shí)間'.date('Y-m-d H:i:s'));
$this->parseAppName();
$this->createQueue();
arsort($this->queue);
if(count($this->queue) <= 0){
return ;
}
foreach ($this->queue as $key => $queue) {
$this->getHistoryId($key,$queue['filter']);
$this->executeAdd($key,$queue);
}
Log::info($name .':結(jié)束運(yùn)行時(shí)間'.date('Y-m-d H:i:s'));
}
輸出的日志文件如下: 80781任務(wù)結(jié)束前系統(tǒng)新開了8個(gè)任務(wù)
[2018-07-10 03:23:18] local.INFO: 80781:開始運(yùn)行時(shí)間2018-07-10 03:23:18
[2018-07-10 03:24:07] local.INFO: 91189:開始運(yùn)行時(shí)間2018-07-10 03:24:07
[2018-07-10 03:25:05] local.INFO: 73828:開始運(yùn)行時(shí)間2018-07-10 03:25:05
[2018-07-10 03:26:09] local.INFO: 96934:開始運(yùn)行時(shí)間2018-07-10 03:26:09
[2018-07-10 03:27:06] local.INFO: 79930:開始運(yùn)行時(shí)間2018-07-10 03:27:06
[2018-07-10 03:28:13] local.INFO: 39674:開始運(yùn)行時(shí)間2018-07-10 03:28:13
[2018-07-10 03:29:06] local.INFO: 44935:開始運(yùn)行時(shí)間2018-07-10 03:29:06
[2018-07-10 03:30:16] local.INFO: 40087:開始運(yùn)行時(shí)間2018-07-10 03:30:16
[2018-07-10 03:31:05] local.INFO: 42935:開始運(yùn)行時(shí)間2018-07-10 03:31:05
[2018-07-10 03:31:26] local.INFO: 91189:結(jié)束運(yùn)行時(shí)間2018-07-10 03:31:26
[2018-07-10 03:31:26] local.INFO: 80781:結(jié)束運(yùn)行時(shí)間2018-07-10 03:31:26
3 回答

慕絲7291255
TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
我測試了一下是正常的, 你的輸出有可能是舊程序的輸出
可以試著將cron停了, 過一段時(shí)間后再啟動排除干擾.

臨摹微笑
TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
因?yàn)槭莣ithoutOverlapping,所以考慮以下幾個(gè)方面
1、storage的權(quán)限以及是否有權(quán)限touch用于schedule的互斥文件;
2、在任務(wù)執(zhí)行出sleep多秒,多次執(zhí)行php artisan schedule:run,查看schedule互斥文件是否生成。

動漫人物
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
問題已經(jīng)解決:
參考@aaronwu的回答
1、storage的權(quán)限以及是否有權(quán)限touch用于schedule的互斥文件;
2、在任務(wù)執(zhí)行出sleep多秒,多次執(zhí)行php artisan schedule:run,查看schedule互斥文件是否生成。
首先檢查了權(quán)限沒問題,有寫權(quán)限沒問題。
其次檢查了schedule互斥文件是否生成
,好吧沒有,有寫權(quán)限然后沒有生成文件,猜想是寫互斥文件的地方以后問題。
File:\vendor\laravel\framework\src\Illuminate\Console\Scheduling\Event.php
這個(gè)文件可以看到互斥鎖文件所在的目錄和名稱。
我的是:framework/schedule-755d6620f1985cc92ffef6bd535af9a0f3354c3d
public function mutexName()
{
return 'framework'.DIRECTORY_SEPARATOR.'schedule-'.sha1($this->expression.$this->command);
}
然后查看源碼看到互斥鎖是使用的系統(tǒng)的緩存服務(wù)。猜想是緩存服務(wù)出了問題。
然后查看緩存的配置文件,發(fā)現(xiàn)之前配置的緩存驅(qū)動CACHE_DRIVER=array
修改成file之后就可以了。
File:\vendor\laravel\framework\src\Illuminate\Console\Scheduling\CacheMutex.php
/**
* Create a new overlapping strategy.
*
* @param \Illuminate\Contracts\Cache\Repository $cache
* @return void
*/
public function __construct(Cache $cache)
{
$this->cache = $cache;
}
- 3 回答
- 0 關(guān)注
- 1657 瀏覽
添加回答
舉報(bào)
0/150
提交
取消