Laravel liebig/cron 同时执行两次 cronjob

Laravel liebig/cron executes the cronjob twice for same time

我正在使用 laravel 4.2

我有一个项目要求每隔 Monday 6 am 向所有用户发送一些分析报告电子邮件。

显然是计划任务,所以我决定使用cron-job

为此,我安装了 liebig/cron 包。软件包安装成功。为了测试电子邮件,我在 app/start/global.php 中添加了以下代码:

Event::listen('cron.collectJobs', function() {
    Cron::setEnablePreventOverlapping();

    // to test the email, I am setting the day of week to today i.e. Tuesday
    Cron::add('send analytical data', '* * * * 2', function() {

        $maildata = array('email' => 'somedomain@some.com');

        Mail::send('emails.analytics', $maildata, function($message){
            $message->to('some_email@gmail.com', 'name of user')->subject('somedomain.com analytic report');
        });

        return null;

    }, true);

    Cron::run();
});

同样在 app\config\packages\liebig\cron\config.php 中,键 preventOverlapping 设置为 true

现在,如果我运行它喜欢php artisan cron:run它会同时发送两次相同的电子邮件

我已经在我的 DigitalOcean 开发服务器 (ubuntu) 上部署了相同的代码,并将其 crontab 设置为执行此命令 every minute 但它仍然发送相同的电子邮件两次。

它也没有在 app/storage 目录中生成 lock file,根据一些搜索结果我知道它创建了一个 lock file 来防止重叠。该目录已授予完全权限。

有谁知道怎么解决吗?

移除 Cron::run().

这是正在发生的事情:

  • 您的 Cron 路由或 cron:run 命令被调用。
  • Cron 触发 cron.collectjobs 事件以获取事件列表。
  • 您调用了 Cron::run() 和 运行 所有事件。
  • Cron 调用 Cron::run() 和 运行 所有事件。

cron.collectjobs 活动中,您应该只使用 Cron::add() 制作工作列表。


您没有看到锁定文件的原因是 preventOverlapping 设置为 false(默认情况下为 true),或者作业是 运行 如此之快,你看不到它被创建和删除。锁定文件仅在作业 运行 的时间内存在,可能只有几毫秒。