Как пошаговая петля каждые 10 минут - PullRequest
0 голосов
/ 04 января 2019

Краткое описание проблемы

У меня есть команда, которую я запускаю каждый час. Он зацикливается на массиве из 6 элементов и публикует данные в твиттере. Проблема в том, что он публикует все 6 статей в твиттере одновременно. Я бы хотел, чтобы каждый элемент цикла шатался каждые 10 минут. Таким образом, подписчики твиттера не получают спам от нас каждый час.

Что я пробовал

Я сделал не очень элегантное решение для этого. Просто добавив sleep(600); в цикл.

foreach ($parks as $park) {
    Twitter::post(...);
    sleep(600);
}

Это прекрасно работает, но я чувствую, что есть лучший способ, чем этот процесс жить в течение часа.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Если у вас установлена ​​система очередей, я бы рекомендовал использовать отложенную отправку вместо cronjob. Вы также можете иметь запланированный cronjob один раз в час, который отправляет шесть из этих запланированных заданий очереди.

Если вы предпочитаете использовать свою текущую систему, вы можете использовать date('i'), чтобы получить текущие часы минут. Затем вы можете разделить минуты на 10 и округлить результат до пола. Это оставит вас с индексом для вашего массива от 0 до 5:

$minutes = (int) date('i');
$index = floor($minutes / 10);

$park = $parks[$index];

С этой логикой вы можете просто запланировать выполнение текущей работы каждые десять минут, а не каждый час.

Примечание. Возможно, вы захотите проверить, находится ли $index в пределах диапазона вашего массива, просто чтобы быть в безопасности.

0 голосов
/ 04 января 2019

Я бы использовал Job и поставил его в очередь с задержкой. Например:

<?php

namespace App\Jobs;

use App\Park;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class PostToTwitter implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
    * The tweet
    *
    * @var App\Park
    */
    public $park;

    /**
    * Create a new job instance.
    *
    * @return void
    */
    public function __construct(Park $park)
    {
        $this->park = $park;
    }

    /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
    {
        // handles posting to twitter
    }
}

... а затем поставить их в очередь.

foreach ($parks as $key => $park) {
    $job = (new PostToTwitter($park))
        ->delay(now()->addMinutes($key * 10));

    dispatch($job);
}

В этом случае каждая работа будет отложена на 10 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...