у меня есть Ларавел 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) Если нет, как я могу добиться этого через голосование?
Вы можете добиться этого путем сочетания обоих вариантов
Вы можете переписать действие отмены следующим образом
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 ВОТ
Удалить все ключи текущей выбранной БД. Эта команда никогда не терпит неудачу
Я надеюсь, что это будет работать для вас. Убедитесь, что у пользователя вашей операционной системы должно быть разрешение на выполнение команд оболочки через скрипт.
Других решений пока нет …