Laravel 5 — Как прервать цикл PHP?

у меня есть Ларавел 5.2 работа, которую я обычно хочу выполнять без остановки. Для иллюстрации предположим, что он генерирует случайное число, а затем передает его через событие во внешний интерфейс.

/**
* Execute the job. Generate a random number.
*/
public function handle()
{
$number = rand();
event(new NumberWasGenerated($number));
}

По какой-то причине я хочу, чтобы эта работа выполнялась бесконечно. Итак, я сделал другую работу, которая зацикливается и продолжает отправлять новые GenerateNumberрабочие места.

/**
* Execute the job. Continuously generate numbers.
*
* @return void
*/
public function handle()
{
while (true) {
$this->dispatch(new GenerateNumber());
}
}

Однако я хочу иметь возможность «выключить» генератор, если я решу. Вот где у меня проблемы.

В идеале я хотел бы иметь возможность пройти маршрут как /abortкоторый затем отправит прерывание в мой цикл генератора и остановить его выполнение. Как я могу это сделать?

В качестве альтернативы, я мог бы попробовать голосование подход. Я пытался использовать что-то вроде:

/**
* Execute the job. Continuously generate numbers.
*
* @return void
*/
public function handle()
{
Config::set('shouldGenerate', true);

while (Config::get('shouldGenerate')) {
$this->dispatch(new GenerateNumber());
}
}

Тогда по моему controller метод для /abort я имею

public function abort()
{
Config::set('shouldGenerate', false);
}

Тем не менее abort не похоже на работу. Я думаю, что проблема заключается в том, что abort Метод никогда не получит шанс выполнить, потому что цикл генератора — это боров, но я не уверен, почему это так.

Вопрос:

1) Могу ли я достичь этого с помощью прерывание подход?
2) Если нет, как я могу добиться этого через голосование?

0

Решение

Вы можете добиться этого путем сочетания обоих вариантов

  • Прерывание
  • голосование

Вы можете переписать действие отмены следующим образом

public function abort()
{
Config::set('shouldGenerate', false);
exec('PATH/TO/YOUR/RDIS/SERVER/src/redis-cli FLUSHDB');
}

И измените метод дескриптора следующим образом:

/**
* Execute the job. Continuously generate numbers.
*
* @return void
*/
public function handle()
{
$shouldGenerate = Config::get('shouldGenerate');
while ($shouldGenerate) {
$this->dispatch(new GenerateNumber());
}
}

Вы можете прочитать больше о FLUSHDB сервера Redis ВОТ
Удалить все ключи текущей выбранной БД. Эта команда никогда не терпит неудачу

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]