Как заставить Команду Laravel 5 работать как демон

Я создаю пакет WebSocket Server для Laravel 5 (обертка вокруг трещотка, и для моей команды прослушивания я хотел бы предложить опцию для запуска его в качестве фонового демона, чтобы циклы Ratchet продолжали работать, пока пользователь все еще мог вводить новые команды (таким же образом L5 предоставляет эту опцию для очереди: работа команда), однако, я понятия не имею, как это сделать, и поиск в Google мне больше не помог.

Любые советы высоко ценится!

3

Решение

Ответ прост: не позволяйте вашему сценарию завершаться.

Это несколько сложнее, чем кажется, и есть несколько способов сделать это. Некоторые сценарии будут сразу вилка в несколько процессов, причем «главный» выступает в роли пересылки информации из подпроцессов (которые фактически выполняют работу) в терминал (для вывода). Недостатком этого подхода является повышенная сложность, необходимая для межпроцессного взаимодействия (настройка обработчиков сигналов и т. Д.).

Все известные мне решения более или менее сводятся к структуре с непрерывным циклом:

while(true)
{
doWork();
sleep(1);
}

Это процесс демона. Однажды начавшись, он всегда жив. Раз в секунду он проснется и doWork, Недостатком является то, что после запуска единственный способ остановить его — вырваться из него (Ctrl-C) или, если он запущен и выпущен из терминала ($ php myscript.php &) использовать действительно уродливый молоток и kill это по идентификатору процесса. Вы можете обойти это, зарегистрировав обработчики сигналов и имея другие ремесленные команды, которые отправляют сигнал этому процессу, чтобы завершить его, и предоставят вам «чистый» способ завершить ваш процесс.

Еще один потенциальный вопрос, если ваш doWork метод займет больше секунды, вы больше не будете выполнять циклы (более или менее) один раз в секунду. Это может быть проблемой, если потребуется какая-либо синхронность.

В контексте Laravel, внутри команды fire метод вам просто нужно что-то там (например, бесконечное while loop), чтобы команда не возвращалась.

Мой совет вам, однако, не изобретать велосипед. WebSockets для PHP было решено.

Обновить

Если вы создаете оболочку вокруг Ratchet, то Ratchet уже решил проблему с процессом-демоном. Вам просто нужно настроить объект сервера и сказать ему run()что является причиной блокирование выполнение. Возьмите этот пример из аналогичной команды ремесленника:

use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;

// Setup the Ratchet Server.
$server = IoServer::factory(
new HttpServer(
new WsServer(
$messenger
)
),
$port
);

$server->run();
// You won't reach this line unless the server crashes

Первый бит, который создает сервер, который я сохранил у поставщика услуг, второй бит на самом деле внутри команды ремесленника. $messenger Переменная есть моя реализация Ratchet\MessageComponentInterface,

Я хочу сказать, что вам не нужен процесс-демон, чтобы написать оболочку для Ratchet. Храповик уже дает тебе один.

4

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

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

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