Комментарии 10
По ощущениям появление файберов немного запоздало, из-за чего немалая часть php-разработчиков уже предпочитает подобные вещи написать на golang)
Но за статью огромное вам человеческое спасибо, давно хотелось посмотреть более "боевой" пример использования.
Огромное развитие в сторону файберов, вопрос такой можно ли какой-то приземленный вариант? например в виде чата? который будет работать на таком сервере?
Да, файберы и на сервере вебсокетов(который лучше всего для чата) смогут пригодиться, пример тоже можно сделать, пока простой HTTP-сервер
Можно поизучать репозиторий https://github.com/buggregator/trap/
Реализованы в какой-то мере HTTP, WebSocket, SMTP.
Я бы, конечно, не рекомендовал на PHP писать серверы прям на замену RoadRunner, FPM и т.д., как минимум потому что:
всегда что-то будет работать в блокирующем режиме (работа с файловой системой, STDIN/OUT, PDO или вендорный пакет)
пыховский zval всегда будет тормознее примитивов в C/Go/Rust...
Но погружаться в эту тему всё-равно как-то надо. Для лёгкого старта можно попробовать phasync, который поможет юзать файберы в ограниченном контексте на готовом проекте. Останется только найти, что параллелить :) говорят под доктрину есть async драйвера
Ну если PDO и блокирует, то mysqli как раз может работать асинхронно. Только пул надо создать, на несколько соединений чтобы использовать их паралельно :)
Под многие вещи у amphp есть асинхронные драйвера. Можно сразу туда идти и набирать. Или сразу на AMP писать :)
Однако вендорные штуки или ORM переписывать всё-равно не будешь ¯\_(ツ)_/¯
. А там и PDO, и чего только нет.
Ещё одна большая проблема — протекание контекста. Например один общий Unit of Work или Entity Manager. В некоторых случаях даже разные инстансы контейнера на отдельный запрос не помогут.
STDOUT/ERR не должны особо мешать, т.к. если через fprintf туда писать, то должен будет использоваться буферизованный ввод/вывод, а это считай без блокирования.
Пакетов с блокирующими вызовами, да, конечно, больше, чем без. Но это практически для любой платформы (кроме Node.js и подобных) актуально.
C RoadRunner и FPM беда в том, что там для обработки каждого отдельного запроса нужен свой отдельный процесс, который будет блокироваться на блокирующих вызовах, а потому если много запросов - будет много процессов, а к этому операционки не готовы, вот если бы вместо процессов были треды...
Ну неплохо. Допилить полноценный набор всех методов (PUT, DELETE, etc), работу с заголовками и оформить это всё в виде фреймворка, можно будет первую версию сервера выпускать)
Пример HTTP-сервера на PHP с использованием файберов