Чем php плох для реализации websocket сервера?

error1001es

Новичок
Чем php плох на данный момент для реализации websocket сервера?
Почему все говорят, что на нем не стоит писать websocket сервера?
В php мне очень удобно использовать pdo для работы с бд, но например на node js сложно сделать авторизацию, работу с бд и т.д.
 

fixxxer

К.О.
Партнер клуба
В обычном своем режиме работы PHP запускается для выполнения одного запроса и умирает, и при этом в рамках одного процесса одновременно может исполнить только один запрос.

Вебсокет-сервер же подразумевает постоянно работающий процесс, обрабатывающий кучу соединений в event loop. В "обычном" php это не делается.

Написать такое на PHP можно, используя pecl-расширения типа pecl/event - более того, есть готовые библиотеки, такие как Ratchet. Но при этом тем же PDO пользоваться нельзя - все стандартные библиотеки PHP работают синхронно, что означает, что пока выполняется SQL-запрос, процесс ничего больше делать не может. Ratchet работает через ReactPHP, который (через pecl-расширения) реализует event loop подобно nodejs, и все библиотеки - например, для работы с базой - там тоже свои, асинхронные. То есть, все неудобства в виде невозможности использования привычных инструментов прилагаются, и принципиальной разницы между ReactPHP и NodeJS нет.

например на node js сложно сделать авторизацию, работу с бд и т.д.
С нуля - конечно, сложно, а зачем? Есть, например, прекрасный фреймворк NestJS.
 

error1001es

Новичок
В обычном своем режиме работы PHP запускается для выполнения одного запроса и умирает, и при этом в рамках одного процесса одновременно может исполнить только один запрос.

Вебсокет-сервер же подразумевает постоянно работающий процесс, обрабатывающий кучу соединений в event loop. В "обычном" php это не делается.

Написать такое на PHP можно, используя pecl-расширения типа pecl/event - более того, есть готовые библиотеки, такие как Ratchet. Но при этом тем же PDO пользоваться нельзя - все стандартные библиотеки PHP работают синхронно, что означает, что пока выполняется SQL-запрос, процесс ничего больше делать не может. Ratchet работает через ReactPHP, который (через pecl-расширения) реализует event loop подобно nodejs, и все библиотеки - например, для работы с базой - там тоже свои, асинхронные. То есть, все неудобства в виде невозможности использования привычных инструментов прилагаются, и принципиальной разницы между ReactPHP и NodeJS нет.


С нуля - конечно, сложно, а зачем? Есть, например, прекрасный фреймворк NestJS.
То есть если я попытаюсь запустить pdo, он остановит все остальное? почему я не могу запустить его в другом потоке?
 

fixxxer

К.О.
Партнер клуба
Справедливости ради, есть тот же Swoole (корутины плюс тредпул, вроде бы), но это все экспериментальные штуки, в продакшен я бы такое тащить побоялся. Но можешь попробовать. Впрочем, там тоже для всего придется использовать их корутин-френдли реализации.

В целом да, на PHP подобное писать - странно.
Хотя я писал. :) Но сейчас предпочту node или golang в зависимости от задачи
 

error1001es

Новичок
Справедливости ради, есть тот же Swoole (корутины плюс тредпул, вроде бы), но это все экспериментальные штуки, в продакшен я бы такое тащить побоялся. Но можешь попробовать. Впрочем, там тоже для всего придется использовать их корутин-френдли реализации.


В целом да, на PHP подобное писать - странно.
Хотя я писал. :) Но сейчас предпочту node или golang в зависимости от задачи
Как я понял Swoole это идет с коробки? а смогу ли я использовать pdo в swoole?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
То есть если писать websocket сервер и работу с бд + авторизации, то лучше изучать другие языки?
Лучше учиться правильно ставить задачи. Вам нужна коммуникация с PHP-приложением через вебсокеты или вебсокет-сервер, написанный на PHP?
Если первое, то это тривиально решается через прокси-серверы типа pushpin и Centrifugo. Если второе - вам выше рассказали.
 

error1001es

Новичок
Лучше учиться правильно ставить задачи. Вам нужна коммуникация с PHP-приложением через вебсокеты или вебсокет-сервер, написанный на PHP?
Если первое, то это тривиально решается через прокси-серверы типа pushpin и Centrifugo. Если второе - вам выше рассказали.
Так использовать сразу несколько языков же плохо? Мне просто удобны сессии на php
 

Фанат

oncle terrible
Команда форума
чего?
Что значит "плохо"? Кому плохо?
И каким местом тут сессии вообще? Ты же говорил про пдо?
особенно учитывая что сессия - это тупо кука + файл на сервере и реализуется в две строчки на любом языке.
Я чувствую, что ответ фиксера - это, похоже, опять анкедот, Папа, а почему яблоко коричневеет

Какая задача изначально стоит? Чятик?
 

error1001es

Новичок
чего?
Что значит "плохо"? Кому плохо?
И каким местом тут сессии вообще? Ты же говорил про пдо?
особенно учитывая что сессия - это тупо кука + файл на сервере и реализуется в две строчки на любом языке.
Я чувствую, что ответ фиксера - это, похоже, опять анкедот, Папа, а почему яблоко коричневеет

Какая задача изначально стоит? Чятик?
Не знал, что на других языках будет такая же лёгкая работа с сессиями и бд, а что насчёт ООП? Который мне больше нравится в php?
 

AmdY

Пью пиво
Команда форума
Тебе не надо ни на чём другом писать, просто поднимаешь центрифугу и взаимодействуешь с ней из PHP по апи.
 

WMix

герр M:)ller
Партнер клуба
на любом языке, на момент блокировки потока записью/считыванием из базы/файла, сокет не будет обрабатываться.
другое дело в java/go есть мультипоточность а в node ассинхронность.
можно писать websocket на php но помни про блокировку. можно и базу использовать но ассинхронно
 

weregod

unserializer
кстати, может я чо-то пэ, но если ТС собрался сам слушать порт, никаких php-шных сессий не будет там
 

Фанат

oncle terrible
Команда форума
Я думаю тут всё коничится чятиком на фреймах с авторефрешем
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
вот вы гоните

1. у swoole есть блокирующий и неблокирующий режимы
2. roadrunner - пу сути, то же самое, что swoole в блокирующем, и таки дает снижение latency ответа на порядок с 50 до 5 мс, за счет проблем с утечками памяти, естественно, и это позволяет написать несложный websocket-сервер с достаточной скоростью
3. preload в 7.4 решает ту же самую проблему чуть менее эффективно, но решает ... с новым годом, короче, могли бы иногда и новости читать, а не только хейтить ... хотя, golang мне нравится, но тут он ничего не даст
4. swoole в проде встречал, проблемы там две: не всегда закрывает соединение с клиентом и нет leaking bucket - тупо рубит новые соединения когда больше лимита, от nginx не уйдем
5. зачем mysql с PDO? с redis отлично будет бегать в блокирующем режиме, ничуть не хуже чем на ноде, без тонны зависимостей, даже без фреймвоков несложно сделать, легкий деплой и все остальные преимущества php
6. помню, @флоппик написал простенький сборщик логов с записью в mysql через PDO когда react не умел, и ничего оно не тормозило, работает уже не один год, наверное, откуда вы взяли что там 100 запросов в секунду?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
6. помню, @флоппик написал простенький сборщик логов с записью в mysql через PDO когда react не умел, и ничего оно не тормозило, работает уже не один год, наверное, откуда вы взяли что там 100 запросов в секунду?
Там драйвер уже был, но он не умел батчи. Но там на пдо можно было написать, потому что там был 1 батч инсерт в минуту только, и никаких селектов.
У меня сейчас в неск. проектах есть уже новый реактпхп драйвер, который довели до ума.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Там драйвер уже был, но он не умел батчи. Но там на пдо можно было написать, потому что там был 1 батч инсерт в минуту только, и никаких селектов.
У меня сейчас в неск. проектах есть уже новый реактпхп драйвер, который довели до ума.
в этом и смысл микросервиса, ты мог накопить пакет из кучи клиентских запросов, чтобы его вставить - накопить fpm не умеет,
и масштабируется это при желании nginx-м по N апстримов "линейно", хоть на миллион юзеров в сутки
вообще, понимать - намного важнее, чем просто писать хоть на ноде, хоть на golang

если не рвать соединение с mysql, select может отрабатывать быстро, и даже в блокирующем режиме может и не создавать проблем - есть такие живые проекты
 
Сверху