Тестировал широковещание Ларавел. Просто по https://laravel.com/docs/6.x/broadcasting только без приватности и проверки доступа.
Установлено: laravel echo, laravel echo server, socket.io-client, predis
Кейс: меняю название канала в классе события. Т.е:
public function broadcastOn()
{
return new Channel('new_channel_name');
}
Но название канала не меняется, пока я не перезапущу сервис работы очереди. То что не поменялось смотрю по тому, что отдает laravel-echo-server в devmode.
Как это работает? Почему я меняю код, но по факту название Канала меняется только при перезапуске обработчика очереди?
В Laravel каждый Job, включая описанный в документации обработчик broadcast-событий, оформляется в виде отдельного класса-обработчика. Выполнением этих Job'ов фактически занимается отдельный процесс операционной системы, запускаемый консольной командой php artisan queue:work
и являющийся зацикленным процессом с простым алгоритмом:
handle()
в этом экземпляре Job'а;--timeout=...
);Это, конечно, очень упрощенный алгоритм, но он позволяет понять логику работы. Если у Вас какой-либо Job в этом обработчике уже хотя бы один раз выполнился - то класс этого Job'а, а также все требуемые им классы (в Вашем случае - класс события с названием канала), уже загружены автозагрузчиком в том виде, в котором были на момент первого обращения. Соответственно, внося изменения в исходный код этого Job'а или любого им используемого класса (в Вашем случае - класса события, в котором Вы меняете наименование канала), Вы должны перезапустить обработчик. Просто потому, что повторно читать исходный код загруженных классов он не будет - класс уже загружен в том виде, в котором он был на момент первого к нему обращения.
Если же Вы создадите новый Job (как пишете в комментарии) и поместите его в очередь выполнения, то, согласно приведенного выше описания алгоритма, обработчик наткнется на неизвестный ему класс и загрузит его с помощью автозагрузчика классов в том виде, в котором он будет на момент первого обращения.
Таким образом, для добавления новых Job'ов перезагружать обработчик очереди не нужно. Но вот для того, чтобы заработал измененный код, обработчик придется перезапустить. Иначе никак.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Работаю с базой данных MYSQL через интерфейс PDOНужно ошибки баз данных записывать в отдельный log
Имеется один физический раздел который называется catalog из него читается файл indexphp в котором будет расположена основная логика каталога
Как сделать, чтобы значение сохранялось при переходе на другую страницу?