是每分钟运行一次Cron还是动态地写Cron Job更好?


Is it better to run Cron every minute or write Cron Job dynamically?

我有一个简单的应用程序,用户可以在其中添加帖子并安排它在特定时间上线。

现在我面前有两个方法:

第一种方法:我可以设置一个脚本,它将每分钟调用一次,它将检查是否有任何帖子在当前时间待定,并将发布它们,如果它们是这样的:

My Cron Job:

1 * * * * php myScriptToMakePostLive.php

第二种方法我可以在用户提交以后发布的文章时动态地在服务器上设置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 !!');
    } 

我想知道的是哪个是更好的方法,为什么?

老实说,都不是。

我会使用像芹菜这样的调度服务。如果我必须滚动我自己的调度服务,它将是at而不是cron

这也取决于你认为用户发布帖子的频率。

我会选择第一种方法,因为它简单得多。您只有一个活动部分(单个cron作业),而不是为每个计划的帖子添加一个新作业。在选项#2中,还存在两个进程试图同时写入crontab并可能丢失其中一个作业的风险。第一条简单明了,我不知道第二条能给你带来什么。

我认为我会使用"静态cronjob"方法并将作业存储在数据库中,因为"cron作为动态一次性调度程序"存在一些缺点:

  • crontab会变大…克隆作业应该在运行时将自己从crontab中删除。

  • 如果您的服务器在应该调度作业的时候停机了怎么办?crontab是否检查过期的作业?

  • 如果你需要将你的应用程序迁移到另一个服务器,你需要迁移crontab…似乎很奇怪,但也许不是那么奇怪

  • 运行包含用户输入的shell命令需要很多小心。