将一个大的cron作业拆分成多个cron作业?

时间:2016-06-07 04:24:29

标签: php mysql laravel laravel-5 cron

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

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

  1. 使用crontab -e设置单个cron作业。
  2. cron作业脚本从数据库中获取所有行,并根据返回的行数确定应该进一步拆分的cron作业数。例如,如果数据库返回1000行,则应将其拆分为10个cron作业,但如果数据库返回10000行,则应将其拆分为100个cron作业。
  3. 所以我的问题是,是否有可能只在crontab -e中列出一个cron作业,然后PHP脚本决定应该分成多少个cron作业(基本上从一个cron作业中调用更多cron作业) PHP脚本)?

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

    这是我目前的剧本:

    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 个答案:

答案 0 :(得分:0)

您可以创建作业并将每个帖子运行到队列中。请参阅此处laravel queue

因此您的代码将如下所示

resource.setrlimit (resource.RLIMIT_NOFILE, (20000,20000))

答案 1 :(得分:-1)

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