В одном из наших проектов laravel в среде Windows нам нужен слушатель очереди. Итак, в начале мы передали следующую команду в командной строке, и это окно осталось открытым.
C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240
Но это не очень хороший шаг, потому что если кто-то по ошибке закрыл или после обновления системы он может закрыться. Итак, мы запланировали фоновый процесс с планировщиком.
Мы запускаем пакетный файл во время запуска системы и каждые 1 час. Пакет имеет следующую команду.
start /MIN /B php C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240
Но через несколько дней после того, как мы исследовали диспетчер задач, мы заметили, что в фоновом процессе было запущено много PHP CLI, что привело к 100% использованию процесса. Система замедлилась. Поэтому мы дополнительно добавили команду, чтобы убить уже работающий PHP CLI. Пакетный файл был похож на приведенные ниже команды.
taskkill /f /fi "imagename eq php.exe"start /MIN /B php C:\Apache24\htdocs\laravel\artisan queue:listen --timeout=240
Теперь нам нужно запустить еще один фоновый процесс с интервалом в 1 минуту. Если он запускается каждую минуту, то запускается новый фоновый процесс PHP CLI. Если мы убьем весь прошлый фоновый процесс PHP CLI, он убьет уже запущенный PHP CLI для artisan queue
,
Так что для этой зависимости, что было бы лучшим подходом для решения этой проблемы.
Наша главная цель — не будет запущен какой-либо фоновый процесс PHP CLI, который потребляет больше памяти.
Я вижу здесь наконец два варианта:
С помощью вашего процесса PHP проверьте, запущен ли уже другой. Если это так — просто долго информация и залог. Если это не так — продолжайте выполнение. Таким образом, вы можете сохранить планировщик, чтобы попытаться запустить процесс, как каждую минуту или около того. Если предыдущий процесс умирает, он будет перезапущен в течение одной минуты.
Используйте какой-нибудь руководитель процесса. Я нашел что-то вроде этого для Windows: winss. Предполагается работать аналогично S6. Затем он убедится, что запущен только один экземпляр, и автоматически перезапустит его, когда он умрет. Другой супервизор — супервизор — его можно запустить через Cygwin. Посмотрите на этот так ответ: Есть ли Windows аналог супервизора?
Других решений пока нет …