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
),或者作业是 运行 如此之快,你看不到它被创建和删除。锁定文件仅在作业 运行 的时间内存在,可能只有几毫秒。
我正在使用 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
),或者作业是 运行 如此之快,你看不到它被创建和删除。锁定文件仅在作业 运行 的时间内存在,可能只有几毫秒。