【问题标题】:Is it better to run Cron every minute or write Cron Job dynamically?每分钟运行 Cron 还是动态编写 Cron Job 更好?
【发布时间】:2015-10-01 20:58:45
【问题描述】:

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

现在我有两种方法:

第一种方法: 我可以设置一个每分钟调用一次的脚本,它会检查当前是否有任何帖子处于待处理状态,如果它们是这样的,则会发布它们:

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

    } 

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

【问题讨论】:

  • 这需要在共享主机上工作,还是可以安装新软件,如作业队列?
  • 1 * * * * 是每小时 1 分钟,每分钟是 * * * * *

标签: php cron crontab cron-task


【解决方案1】:

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

【讨论】:

  • 在第一种方法中,我有一个脚本,它将每分钟运行一次,以检查我当前是否有任何帖子待处理。我担心这是否会导致性能问题。
  • 我在一个拥有数十万篇文章和每月 1500 万访问者的网站上使用这种方法。只要您的表被正确索引,它应该不是问题
【解决方案2】:

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

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

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

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

  • 运行包含用户输入的 shell 命令需要非常谨慎。

【讨论】:

    【解决方案3】:

    呃,说实话,也不是。

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

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

    【讨论】:

    • 出于兴趣,Celery 的 PHP 库支持是怎样的?
    • 呃,我在 github 上找到了一个有库的人,但我自己从未使用过它:github.com/gjedeer/celery-php
    • 嗯,它有很多星星,所以这是一个好的开始:-)。我已经问过 OP 他们是否可以安装其他软件——他们可能在共享主机上。我想知道当 cron/at 可以正常工作时,作业队列是否可能是一个过于庞大的工具——诚然,会有一点延迟。
    • 哼。我认为他们至少可以访问at,如果他们可以访问cron。我只是不是cron-every-minute 的粉丝,除非它实际上是合理的。 (我的一个朋友设法通过 cron-every-minute django 在共享服务器上造成严重的减速。我们在作业中使用 cron 设置解决了一些问题。这是,呃,在我了解 celery 之前)
    • 您可能还没有在一台计算机上查找数据库,并且可能每分钟都在发送电子邮件,这台计算机已经过时了,也是大学校园的通用“乱码”计算机。所以。呃:P
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 2018-07-17
    • 2014-04-06
    • 2019-02-28
    • 2015-03-27
    • 2019-07-20
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多