use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send($request->uri());
};
// Запуск воркера
Worker::runAll();
public function __construct(protected string $buffer) {}
protected string $buffer
это PHP8, можно объявлять свойства объекта прямо в контрукторе (constructor promotion) Мне нужно получить uri не в методе onMessageне понимаю зачем, куда, когда.. Но этот uri можно в onMessage передать куда-нибудь еще или сохранить в переменную, например
$uri = null;
$worker->onMessage = function(TcpConnection $connection, Request $request) use ($uri) {
$uri = $request->uri();
$connection->send($uri);
};
что пробрасывается buffer можно найти по ProtocolInterface::decode, например
не понимаю зачем, куда, когда..
или сохранить в переменную
Обрабатывать маршруты в роутере.роутер от какого-нибудь фреймворка или пакета? Думаю там есть свой Request. Если хотите обрабатывать все подряд, можно маску пути сделать и т.д. Изучайте документацию роутера.
зачем взяли этот проект?
Для изучения ООП можно что-нибудь по проще, тем более что Workerman хреново написан и по нему не стоит изучать ООП.
роутер от какого-нибудь фреймворка или пакета?
Vitsliputsli, то есть нельзя создать экземпляр Request? Здесь Request используется вне onMessage, правда класс наследуется от исходного. Не знаю важно ли это, плохо разбираюсь в работе конструкций классов и объектов.
Потому что он позволяет использовать PHP как полноценный язык, способный держать постоянный процесс. Что дает много новых возможностей, в отличие от общепринятой CGI модели использования PHP, когда процесс запускается отдельным веб-сервером, а после процесс умирает. И дает еще и увеличение производительности. И потому что он проще чем Swoole.
У меня нет цели изучать именно ООП. Моя цель разобраться с Workerman. Мне непонятно как изучать ООП. Я вижу класс Request, везде учат, что нужно создавать экземпляр объекта от класса, а тут выясняется, что просто так объект Request не создашь. То есть чтобы понять как работать конкретно с таким классом, нужно сразу углубляться в какие то тонкости, как это сделать непонятно, так как во всех книжках одна и та же общая информация.
объекты не в вакууме существуют, их чтото создает и передает необходимые данные
А нужно передавать buffer, т.е. сырые данные запроса http.
В Workerman гдето есть код по созданию объекта класса Request, и есть вызов onMessage с передачей туда Request.
Обработка http-запросов демоном на php скорее всего будет менее производительно чем через php-fpm
Зря, не разберетесь с ООП, дальше не сможете продвигаться.
Так у вас уже создан экземпляр класса, Workerman его создал. Весь смысл ООП, что вам не нужно вникать, что и как там делал Workerman - вам не нужно самому парсить запрос http, у вас есть есть готовый объект Request, с набором функций-методов, для удобного получения различных параметров запроса.
Видимо Дейкстра был прав, сказав, что ООП плохая идея, которую могли придумать только в Калифорнии.
Код в ООП стиле сложно понять. По крайней мере мне
Откройте Techempower benchmark. Вчера тестировал workerman с помощью wrk, на одном ядре 50 000 запросов в секунду, на нескольких ядрах сотни тысяч. FPM с Nginx и стандартными настройками показывает 4 500 запросов в секунду.
Буду разбираться. Посоветуйте что нибудь практичное для обучения. Чтобы по больше практики. От толстых книг клонит в сон.
ООП сейчас основная производственная парадигма
Мнение большинства - всегда ошибочно, ибо большинство людей...
Вообще ООП-шный код даже на незнакомом языке зачастую выглядит вполне понятным.
Если бы все было так просто, но синтетические тесты мало информативны на практике.
Это запросы к php или статика тоже?
Не поверю, что веб-сервер на php отдает статику быстрее nginx.
А если у нас сайт, то там большая часть это статика.
Ок, допустим это api, и все запросы к php, "50 000 запросов в секунду" - это 20мкс на запрос, "4 500 запросов в секунду" - это 222мкс на запрос.
За сколько у нас отрабатывает api-запрос, не беря тяжелое и совсем легкое, в среднем 50-100мс.
И это мы еще не тестировали как себя поведет php-шный вебсервер при реальных запросах, где работа с базой, ошибки, а иногда и фатальные и т.д. К примеру, fpm очень хорошо шарит память между своими процессами, а на сколько хорошо workerman это делает?
Большинство не могут ошибаться?
Он только выглядит понятным. Такой код состоит из множества запутанных изменяемых состояний, а это зло. Никакого выигрыша не дает, только усложняет, прибавляет лишнего кода.
Известная мантра. Любой реальный пример ее опровергает.
Не имеет значения. Никогда FPM даже не приблизится к производительности workerman или подобных апликейш серверов.
Не знаю, не тестил, но вообще, сервера на C++ могут быть медленнее серверов на Go. И даже медленнее серверов на Node.js (uWebsockets.js). Просто потому, что хуже написаны. Вы ведь не заботитесь о производительности, правильно понимаю? И другие не заботятся. Просто пишут код и всё. Опытных системных программистов мало. Поэтому в 2025 году большинством используется устаревший во всех смыслах FPM. Заметьте, большинством. Так как большинство всегда ошибочно
Смотря что понимать под сайтом. И смотря как будет устроен этот сайт. Блог это сайт? Блоги на Next.js даже без оптимизаций значительно производительней чем такие же, использующие php-fpm.
Так это на 1 ядре! На 8 ядрах ~300-400к rps. То есть во много раз превосходит fpm + nginx. И это всего лишь hello world. Будь что сложнее, fpm и 1000 rps не покажет. Это вообще смешно.
За столько Next.js полноценную страницу отрисовывает.
FPM в реальных приложениях показывает <1000 rps и все другие показатели соответствуют. Это как сравнивать скорость велосипеда и автомобиля.
Не только я плохо отзываюсь о так называемом ООП, но и многие всемирно известные деятели в IT. Не только Дейкстра. Нужно привести их имена?
По вашему современная индустрия лучше во всем разбирается чем лауреаты премии Тьюринга?
Есть универсальные критерии для оценки. Простое лучше сложного. ФП - простое, ООП - сложное. Чем меньше кода - тем меньше проблем. ФП - мало кода, ООП - много кода.
Человек не приучен мыслить в моделях вычислений с состояниями. Зато с детства приучается мыслить в аппликативных моделях вычислений. Потому ФП - естественная модель программирования, а ООП - нет.
У большинства нет своего мнения. Они просто следуют за кем то. Так было и будет всегда. Поэтому аргумент большинством - не аргумент.
Вы так ничтоже сумняшеся поставили себя в один ряд с Дейкстрой, ну-ну...
Алан Кэй кстати именно за внедрение ООП получил ее, забавно, да?
ФП не такое уж и простое, а ООП не такое и сложное.
Вам когда в детстве давали инструкцию "купи хлеба и вынеси мусор", вы покупали хлеб и сразу его выбрасывли в виде мусора? Или все же знали, чтото о состояниях и обрабатывали их независимо?
используемое повсеместно
Это уже пошли выкрутасы.
Вот только он против современного так называемого ООП. Его слова: "Я придумал термин ООП, но не имел ввиду C++". Есть еще его высказывания подобной направленности.
И чем же ФП сложное? С любой стороны ФП проще. Потому что Лямбда-исчисление само по себе простая модель. Может ли быть полноценный удобный язык проще чем Лисп? Идея о том, что приложение это просто функция - простая. Даже такие сложные приложения как компиляторы/интерпретаторы прекрасно реализуются в таком стиле. Можно легко разложить такое приложение на функции и держать все это в голове. Подобное приложение в стиле современного ООП будет монструозным и запутанным, его невозможно будет держать в голове.
Человек - не машина. Инструкции не любят читать и плохо понимают. Потому что императивность. Декларативный язык математики понимают намного большее количество людей.
Это не означает, что идея не дурацкая. Повсеместно - значит используется большинством. Большинство - всегда ошибочно, потому что нет своего мнения, потому что толпа, у толпы нет интеллекта. Все побежали и я побежал. Самые лучшие идеи всегда не находятся на поверхности.