每分钟 运行 Cron 还是动态编写 Cron Job 更好?
Is it better to run Cron every minute or write Cron Job dynamically?
我有一个简单的应用程序,用户可以在其中添加 post 并安排它在特定时间上线。
现在我有两种方法:
第一种方法:
我可以设置一个每分钟调用一次的脚本,它会检查当前是否有任何 post 处于待处理状态,如果它们是这样,就会发布它们:
我的 Cron 作业:
1 * * * * php myScriptToMakePostLive.php
或
第二种方法
当用户提交他的 post 稍后发布时,我可以在服务器上动态设置 cron 作业。我正在使用这个脚本:
public function schedulePost(){
$post = new Post();
$post->body = $_POST['body'];
$post->save();
$scheduledTime = Carbon::parse($_POST['publish_on']);
//saving cron dynamically
$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.PHP_EOL."{$scheduledTime->minute} {$scheduledTime->hour} {$scheduledTime->day} {$scheduledTime->month} * php myScriptToMakePostLive {$post->id}".PHP_EOL);
echo exec('crontab /tmp/crontab.txt');
die('Your post has been Scheduled !!');
}
我想知道哪种方法更好,为什么?
我会选择第一种方法,因为它简单得多。您只有一个移动部分(单个 cron 作业),而不是为每个计划 post 添加一个新作业。您还 运行 选项 #2 中的风险是有 2 个进程试图同时写入 crontab 并可能丢失其中一个作业。 #1 简单明了,我看不出#2 真正给你带来了什么。
我想我会使用 "static cronjob" 方法并将作业存储在数据库中,因为 "cron as a dynamic oneoff scheduler":
的一些缺点
那个 crontab 会变大...croned 作业应该在 运行?
从 crontab 中删除自己
如果您的服务器在应该调度作业时停机怎么办? crontab 是否检查过期作业?
如果您需要将您的应用程序移动到另一台服务器,您将需要迁移 crontab...看起来很奇怪,但也许 并不奇怪。
运行 shell 包含用户输入的命令需要很多 谨慎。
呃,老实说,两者都不是。
我会使用像 celery. And if I absolutely had to roll my own scheduling service, it'd be with at
这样的调度服务,而不是 cron
这还取决于您认为用户安排帖子的频率。我怀疑它经常发生。
我有一个简单的应用程序,用户可以在其中添加 post 并安排它在特定时间上线。
现在我有两种方法:
第一种方法: 我可以设置一个每分钟调用一次的脚本,它会检查当前是否有任何 post 处于待处理状态,如果它们是这样,就会发布它们:
我的 Cron 作业:
1 * * * * php myScriptToMakePostLive.php
或
第二种方法 当用户提交他的 post 稍后发布时,我可以在服务器上动态设置 cron 作业。我正在使用这个脚本:
public function schedulePost(){
$post = new Post();
$post->body = $_POST['body'];
$post->save();
$scheduledTime = Carbon::parse($_POST['publish_on']);
//saving cron dynamically
$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.PHP_EOL."{$scheduledTime->minute} {$scheduledTime->hour} {$scheduledTime->day} {$scheduledTime->month} * php myScriptToMakePostLive {$post->id}".PHP_EOL);
echo exec('crontab /tmp/crontab.txt');
die('Your post has been Scheduled !!');
}
我想知道哪种方法更好,为什么?
我会选择第一种方法,因为它简单得多。您只有一个移动部分(单个 cron 作业),而不是为每个计划 post 添加一个新作业。您还 运行 选项 #2 中的风险是有 2 个进程试图同时写入 crontab 并可能丢失其中一个作业。 #1 简单明了,我看不出#2 真正给你带来了什么。
我想我会使用 "static cronjob" 方法并将作业存储在数据库中,因为 "cron as a dynamic oneoff scheduler":
的一些缺点那个 crontab 会变大...croned 作业应该在 运行?
从 crontab 中删除自己
如果您的服务器在应该调度作业时停机怎么办? crontab 是否检查过期作业?
如果您需要将您的应用程序移动到另一台服务器,您将需要迁移 crontab...看起来很奇怪,但也许 并不奇怪。
运行 shell 包含用户输入的命令需要很多 谨慎。
呃,老实说,两者都不是。
我会使用像 celery. And if I absolutely had to roll my own scheduling service, it'd be with at
这样的调度服务,而不是 cron
这还取决于您认为用户安排帖子的频率。我怀疑它经常发生。