Я создаю пакет WebSocket Server для Laravel 5 (обертка вокруг трещотка, и для моей команды прослушивания я хотел бы предложить опцию для запуска его в качестве фонового демона, чтобы циклы Ratchet продолжали работать, пока пользователь все еще мог вводить новые команды (таким же образом L5 предоставляет эту опцию для очереди: работа команда), однако, я понятия не имею, как это сделать, и поиск в Google мне больше не помог.
Любые советы высоко ценится!
Ответ прост: не позволяйте вашему сценарию завершаться.
Это несколько сложнее, чем кажется, и есть несколько способов сделать это. Некоторые сценарии будут сразу вилка в несколько процессов, причем «главный» выступает в роли пересылки информации из подпроцессов (которые фактически выполняют работу) в терминал (для вывода). Недостатком этого подхода является повышенная сложность, необходимая для межпроцессного взаимодействия (настройка обработчиков сигналов и т. Д.).
Все известные мне решения более или менее сводятся к структуре с непрерывным циклом:
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. Храповик уже дает тебе один.
Других решений пока нет …