Как стать автором
Обновить

Комментарии 10

По ощущениям появление файберов немного запоздало, из-за чего немалая часть php-разработчиков уже предпочитает подобные вещи написать на golang)

Но за статью огромное вам человеческое спасибо, давно хотелось посмотреть более "боевой" пример использования.

Golang это отлично, но желательно и в нашем любимом и ламповом PHP тоже такое уметь делать и понимать как оно работает.

Огромное развитие в сторону файберов, вопрос такой можно ли какой-то приземленный вариант? например в виде чата? который будет работать на таком сервере?

Да, файберы и на сервере вебсокетов(который лучше всего для чата) смогут пригодиться, пример тоже можно сделать, пока простой HTTP-сервер

Можно, кстати, попробовать заменить $headerLine = socket_read($this->acceptedSocket, 1); на использование socket_recv() и забенчить снова.
Сдаётся мне, на этом можно здорово сэкономить

Можно поизучать репозиторий 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), работу с заголовками и оформить это всё в виде фреймворка, можно будет первую версию сервера выпускать)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории