是每分钟运行Cron还是动态编写Cron Job更好?

时间:2015-07-13 14:25:22

标签: php cron crontab cron-task

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

现在我面前有两种方法:

第一种方法: 我可以设置一个每分钟都会被调用的脚本,它将检查当前是否有任何帖子待处理,并且如果它们是这样的话就会发布它们:

我的Cron工作:

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 !!');

    } 

我想知道哪种方法更好,为什么?

3 个答案:

答案 0 :(得分:2)

我会选择第一种方法,因为它更简单。您只有一个移动部件(单个cron作业),而不是每个预定的帖子添加一个新作业。您还可以在选项#2中运行风险,让2个进程同时尝试编写crontab并可能丢失其中一个作业。 #1简单明了,我不知道#2真的买了什么。

答案 1 :(得分:2)

呃,说实话,不是。

我会使用像celery这样的日程安排服务。如果我绝对不得不推出自己的日程安排服务,那就是at而不是cron

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

答案 2 :(得分:1)

我想我会使用"静态cronjob"在数据库中处理和存储作业是因为" cron作为动态一次性调度程序的一些缺点":

  • crontab会变大...... croned作业应该在运行时从crontab中删除?

  • 如果您的服务器在应该分派作业时遇到停机怎么办? crontab会检查过期的工作吗?

  • 如果您需要将应用程序移动到另一台服务器,则需要迁移crontab ...看起来很奇怪,但也许 很奇怪。< / p>

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