【问题标题】:Split up a large cron job into multiple cron jobs?将大型 cron 作业拆分为多个 cron 作业?
【发布时间】:2016-10-06 19:55:28
【问题描述】:

我正在使用 Laravel 5.2。我目前有一个 cron 作业,它从我的数据库中获取数千行并对这些行中的每一行执行计算。 cron 作业目前大约需要一个小时才能运行,但数据库每天都在不断变大。

一种选择是使用crontab -e 手动添加更多 cron 作业(即,将作业分成 5 个较小部分的 5 个 cron 作业)。但是,是否也可以执行以下操作:

  1. 使用 crontab -e 设置单个 cron 作业。
  2. cron 作业脚本从数据库中获取所有行,并根据返回的行数确定应进一步拆分为多少个 cron 作业。例如,如果数据库返回 1000 行,则应将其拆分为 10 个 cron 作业,但如果数据库返回 10000 行,则应将其拆分为 100 个 cron 作业。

所以我的问题是,是否有可能在crontab -e 中只列出一个 cron 作业,然后 PHP 脚本决定它应该分成多少个 cron 作业(本质上是从 PHP 脚本调用更多的 cron 作业)?

这样做安全吗?有没有更好的方法来解决这个问题?

这是我当前的脚本:

class PostCron extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'post_cron';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $posts = Post::all(); // currently returns ~1000 rows, but grows in size daily

        foreach ($posts as $post) {
            // computations on each separate post
        }
    }
}

【问题讨论】:

  • 2 没有创建新的 cron 作业;但只需运行 X 个脚本
  • @Dagon 这就是我的意思

标签: php mysql laravel laravel-5 cron


【解决方案1】:

您可以创建工作并将每个帖子运行到队列中。参考这里laravel queue

所以您的代码将如下所示

protected $bus;
/**
 * Create a new command instance.
 *
 * @return void
 */
public function __construct(\Illuminate\Contracts\Bus\Dispatcher $bus)
{
    parent::__construct();

    $this->bus = $bus;
}

public function handle()
{
   $posts = Post::all(); // currently returns ~1000 rows, but grows in size daily

   foreach ($posts as $post) {
       // computations on each separate post
       $this->bus->dispatch(new YourJobClassName($post));
   }
}

【讨论】:

  • 我所做的计算更多地受益于 cron 作业,而不是队列。它们需要每小时运行一次,而不是加入队列中,希望能在一小时内完成。
  • 是的,您的 cron 将执行队列中的计算作业。您还可以设置队列同时运行的进程数以使其快速laravel.com/docs/5.2/queues#supervisor-configuration
  • 我的意思是我想使用 cron 作业,而不是队列。
  • 取决于,我认为最好的情况是使用带有队列的 cron。但是如果你想运行多个 crons,也许可以在你的 Kernel.php 中添加相同的命令,但肯定不是好选择
【解决方案2】:

我建议使用排队。有一些工具可以做到这一点,比如 Beanstalkd。然后你就有了一个 cronjob,它向队列中添加了几个任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2012-02-08
    • 2013-06-12
    • 1970-01-01
    • 2021-05-10
    • 2013-03-05
    • 2014-06-13
    相关资源
    最近更新 更多