鍍金池/ 問答/PHP/ Laravel定時任務(wù)重復(fù)執(zhí)行

Laravel定時任務(wù)重復(fù)執(zhí)行

Laravel定時任務(wù)執(zhí)行的命令的時間不確定,我根據(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 . ':開始運行時間'.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é)束運行時間'.date('Y-m-d H:i:s'));
    }
輸出的日志文件如下: 80781任務(wù)結(jié)束前系統(tǒng)新開了8個任務(wù)
[2018-07-10 03:23:18] local.INFO: 80781:開始運行時間2018-07-10 03:23:18  
[2018-07-10 03:24:07] local.INFO: 91189:開始運行時間2018-07-10 03:24:07  
[2018-07-10 03:25:05] local.INFO: 73828:開始運行時間2018-07-10 03:25:05  
[2018-07-10 03:26:09] local.INFO: 96934:開始運行時間2018-07-10 03:26:09  
[2018-07-10 03:27:06] local.INFO: 79930:開始運行時間2018-07-10 03:27:06  
[2018-07-10 03:28:13] local.INFO: 39674:開始運行時間2018-07-10 03:28:13  
[2018-07-10 03:29:06] local.INFO: 44935:開始運行時間2018-07-10 03:29:06  
[2018-07-10 03:30:16] local.INFO: 40087:開始運行時間2018-07-10 03:30:16  
[2018-07-10 03:31:05] local.INFO: 42935:開始運行時間2018-07-10 03:31:05  
[2018-07-10 03:31:26] local.INFO: 91189:結(jié)束運行時間2018-07-10 03:31:26 
 
[2018-07-10 03:31:26] local.INFO: 80781:結(jié)束運行時間2018-07-10 03:31:26
回答
編輯回答
淺時光

clipboard.png

clipboard.png

我測試了一下是正常的, 你的輸出有可能是舊程序的輸出
可以試著將cron停了, 過一段時間后再啟動排除干擾.

2017年8月6日 02:19
編輯回答
念舊

因為是withoutOverlapping,所以考慮以下幾個方面
1、storage的權(quán)限以及是否有權(quán)限touch用于schedule的互斥文件;
2、在任務(wù)執(zhí)行出sleep多秒,多次執(zhí)行php artisan schedule:run,查看schedule互斥文件是否生成。

2018年7月11日 05:43
編輯回答
慢半拍

問題已經(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
這個文件可以看到互斥鎖文件所在的目錄和名稱。
我的是: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;
    }
2017年9月19日 23:12