我需要创建一个每分钟运行一次的cron作业,并在mysql数据库中搜索所有行,这些行的日期字段等于当前日期和时间四舍五入到分钟。
我的问题是什么是正确的查询,也许是存储活动日期的最佳方式。
这里的基本用例是我已经安排了活动,我需要在这些活动安排的确切时间发送通知。这似乎是一件很常见的事情,但我无法弄清楚这是否是最佳方法。
提前致谢。
答案 0 :(得分:1)
为您的计划程序创建一个artisan命令:
file:app / commands / CheckSchedule.php
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class CheckScheduleCommand extends Command {
/**
* The console command name.
*
* @var string
*/
protected $name = 'check:schedule';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Process scheduled messages.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(Scheduler $scheduler)
{
parent::__construct();
$this->scheduler = $scheduler;
}
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$this->scheduler->check();
}
}
告诉Artisan加载命令编辑文件app \ start \ artisan.php并添加:
Artisan::resolve('CheckScheduleCommand');
创建一个Scheduler类:
class Scheduler {
public function check()
{
$date = \Carbon\Carbon::now();
// set the seconds to 59 to get the 'whole' minute in the
$date->second = 59;
/// this filter will get every notification not sent from now to the past
/// If your server got slow or something like that people will still be notified
$notifications = Schedule::where('notify_at','<=',$date)->where('notified',false)->get();
foreach($notifications as $notification)
{
$this->notify($notification);
}
}
public function notify($notification)
{
/// do whatever you need here to notify your user;
$notification->notified = true;
$notification->save();
}
}
然后通过运行
进行测试php artisan check:schedule
你可以每分钟使用cron
* * * * * /path/to/php /var/www/project/artisan check:schedule
关于您的日期字段,您最好使用时间戳,更容易过滤,您可以使用acessors和mutators使人们友好地使用它并仍然将其存储为时间戳:http://laravel.com/docs/eloquent#accessors-and-mutators
答案 1 :(得分:0)
也许你需要稍微改变逻辑。
你可以让它变得更容易,只需实现这一块查询:
... WHERE date_field <= CURRENT_TIMESTAMP() AND processed = 0;
注意我已经使用过CURRENT_TIMESTAMP()函数,因为它的查询速度很快,如果你把日期存储为INTEGER类型字段中的unix时间戳,那就会很快