我正在使用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
以防止重叠。该目录已授予完全权限。
有谁知道如何解决?
答案 0 :(得分:1)
Cron::run()
。以下是发生的事情:
cron.collectjobs
事件以获取事件列表。Cron::run()
并运行所有活动。Cron::run()
并运行所有事件。在cron.collectjobs
活动中,您应该只使用Cron::add()
制作工作清单。
您没有看到锁定文件的原因是preventOverlapping
设置为false
(默认情况下为true
),或者作业运行速度过快看不到它被创建和删除。锁定文件仅在作业运行时存在,可能只有几毫秒。