Laravel liebig / cron同时执行两次cronjob

时间:2015-07-07 11:03:04

标签: laravel cron

我正在使用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,但它仍在发送两次同样的邮件。

同样,它还没有在lock file目录中生成app/storage,根据一些搜索结果,我发现它创建了lock file以防止重叠。该目录已授予完全权限。

有谁知道如何解决?

1 个答案:

答案 0 :(得分:1)

删除Cron::run()

以下是发生的事情:

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

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

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