У меня есть проект, который должен постоянно отправлять уведомления через WebSockets. Он должен подключиться к устройству, которое возвращает общий статус в строчном формате. Система обрабатывает его, а затем отправляет уведомления на основе различных условий.
Поскольку планировщик может повторять задачу уже через минуту, мне нужно найти способ выполнить функцию каждую секунду.
Вот мое app/Console/Kernel.php
:
<?php ... class Kernel extends ConsoleKernel { ... protected function schedule(Schedule $schedule) { $schedule->call(function(){ // connect to the device and process its response })->everyMinute(); } }
PS: Если у вас есть идея справиться с ситуацией, поделитесь своими мыслями.
Обычно, когда вы хотите больше детализации, чем 1 минуту, вам нужно написать демона.
Я советую вам попробовать, теперь это не так сложно, как это было несколько лет назад. Просто начните с простого цикла внутри команды CLI:
while (true) { doPeriodicStuff(); sleep(1); }
Одна важная вещь: запустить демон через супервизор . Вы можете взглянуть на статьи о настройке слушателя очереди Laravel, он использует тот же подход (демон + супервизор). Раздел конфигурации может выглядеть так:
[program:your_daemon] command=php artisan your:command --env=your_environment directory=/path/to/laravel stdout_logfile=/path/to/laravel/app/storage/logs/your_command.log redirect_stderr=true autostart=true autorestart=true
$schedule->call(function(){ while (some-condition) { runProcess(); } })->name("someName")->withoutOverlapping();
В зависимости от того, как долго runProcess()
, вы можете использовать sleep(seconds)
для более точной настройки.
some-condition
обычно является флагом, который вы можете изменить в любое время, чтобы иметь контроль над бесконечным циклом. например, вы можете использовать file_exists(path-to-flag-file)
для ручного запуска или остановки процесса в любое время.
Вы можете попробовать и дублировать задания каждую секунду * 60 раз, используя сон (1).