2016-06-07 3 views
0

Я использую Laravel 5.2. В настоящее время у меня есть задание cron, где он извлекает много тысяч строк из моей базы данных и выполняет вычисления по каждой из этих строк. Задача cron в настоящее время занимает примерно один час, но база данных продолжает увеличиваться с каждым днем.Разделить большую работу cron на несколько заданий cron?

Один из вариантов заключается в том, чтобы вручную добавить дополнительные задания cron, используя crontab -e (т. Е. Задания на 5 cron, которые разделяют задание на 5 небольших частей). Тем не менее, можно также сделать примерно следующее:

  1. Настройте одно задание cron, используя crontab -e.
  2. Сценарий задания cron получает все строки из базы данных и, в зависимости от того, сколько строк возвращается, определяет количество заданий cron, в которые он должен быть разбит. Например, если база данных возвращает 1000 строк, она должна разбить ее на 10 заданий cron, но если база данных возвращает 10000 строк, она должна разбить ее на 100 заданий cron.

Так что мой вопрос, можно ли иметь только один хрон работу перечисленных в crontab -e, где PHP скрипт решает, сколько еще хрон рабочих мест должно быть разделено на (по существу, вызывая больше хрон рабочих мест от 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 
     } 
    } 
} 
+0

2 не создает новые рабочие места хрон; но просто запустил X число скриптов –

+0

@Dagon Вот что я имел в виду –

ответ

-1

Я хотел бы предложить использовать очереди. Есть инструменты для этого, как Beanstalkd. Затем у вас есть один cronjob, который добавляет несколько задач в очередь.

0

вы можете создать задание и запустить каждое сообщение в очередь. см здесь 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)); 
    } 
} 
+0

Вычисления, которые я делаю, больше выигрывают от задания cron, а не очереди. Им НЕОБХОДИМО запускать каждый час и не добавлять в очередь в надежде, что он закончится в течение часа. –

+0

Да, ваш cron выполнит задания вычисления в очереди. вы также можете установить количество процессов для очереди, которые будут выполняться одновременно, чтобы быстро выполнить https://laravel.com/docs/5.2/queues#supervisor-configuration. – xmhafiz

+0

Аналогичная проблема здесь http://stackoverflow.com/questions/35906749/laravel-run-multiple-scheduled-tasks?rq=1 – xmhafiz

Смежные вопросы