每分钟 运行 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

这还取决于您认为用户安排帖子的频率。我怀疑它经常发生。