PHP претерпел значительные изменения и продолжает развиваться, предлагая новые функции, синтаксис и улучшенную скорость. Экосистема PHP также расширяется: многие разработчики создают фреймворки, чтобы упростить жизнь другим разработчикам. Существуют популярные полнофункциональные фреймворки, такие как Laravel и Symfony, а также легковесные микро-фреймворки, такие как FrameworkX.
FrameworkX — это легковесный микро-фреймворк для PHP, использующий архитектуру на основе событий и неблокирующую архитектуру, подобную Node.js, что идеально подходит для приложений с высокой одновременной нагрузкой и реального времени, таких как чаты или живые уведомления.
В этой статье мы рассмотрим, что такое FrameworkX и чем он отличается от традиционных PHP фреймворков. Давайте начнем!
Начало работы
Сначала убедитесь, что у вас установлены PHP и Composer. После установки вы можете добавить FrameworkX в ваш проект с помощью следующей команды:
```bash
composer require clue/framework-x
```
FrameworkX не требует сложной настройки. Всё, что вам нужно, это файл `public/index.php`. Вот простой пример, который выводит «Hello World!» на главной странице:
```php
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::plaintext("Hello world!\n"));
$app->run();
```
Чтобы запустить ваше приложение, введите:
```bash
php public/index.php
```
Эта команда запускает локальный сервер с использованием встроенного сервера PHP, поддерживаемого компонентом ReactPHP Socket. Нет необходимости в Nginx или Apache. Ваш сервер будет работать по адресу http://127.0.0.1:8080, и он должен отобразить «Hello World!».
Помимо обычного текста, вы также можете возвращать данные в формате JSON. Например:
```php
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$users = [['name' => 'Jon Doe'], ['name' => 'Jane Doe']];
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::json($users));
$app->run();
```
Асинхронные операции
Операции PHP обычно являются блокирующими и синхронными, что означает, что каждая задача должна завершиться, прежде чем начнется следующая. FrameworkX построен на библиотеке ReactPHP.
ReactPHP — это библиотека, которая предоставляет компоненты, такие как EventLoop, Stream, Promise, Async и HTTP, которые позволяют выполнять асинхронные операции. Таким образом, задачи могут выполняться одновременно, не ожидая завершения других. Это идеально подходит для обработки нескольких подключений, HTTP-запросов или операций ввода/вывода одновременно.
В этом примере мы обновили наш `index.php`, чтобы выполнить запрос к API. Вместо использования функций `curl_*`, мы будем использовать компонент HTTP для выполнения асинхронного запроса.
```php
$app = new FrameworkX\App();
$app->get('/', function () {
echo "Start\n";
(new \React\Http\Browser())
->get('https://www.hongkiat.com/blog/wp-json/wp/v2/posts')
->then(function () {
echo "End (API)\n";
});
echo "End\n";
return \React\Http\Message\Response::plaintext("Hello world!\n");
});
$app->run();
```
Скорость
Тестирование FrameworkX на базовом, недорогом сервере DigitalOcean с 1 vCPU и 1 ГБ RAM. Он справился с около 4000 запросами в секунду без труда.
Уровень одновременных запросов: 50
Время на тесты: 22.636 секунд
Завершенные запросы: 100000
Неудачные запросы: 0
Запросы Keep-Alive: 100000
Всего передано: 17400000 байт
HTML передано: 1300000 байт
Запросов в секунду: 4417.69 [#/сек] (в среднем)
Время на запрос: 11.318 [мс] (в среднем)
Время на запрос: 0.226 [мс] (в среднем, по всем одновременным запросам)
Скорость передачи: 750.66 [Кбайт/сек] получено
Даже с дополнительной нагрузкой, такой как операции чтения с диска и рендеринг 100 списков из JSON-файла, он все равно обрабатывал около 2700 запросов в секунду.
Уровень одновременных запросов: 50
Время на тесты: 36.381 секунд
Завершенные запросы: 100000
Неудачные запросы: 0
Запросы Keep-Alive: 100000
Всего передано: 296700000 байт
HTML передано: 280500000 байт
Запросов в секунду: 2748.72 [#/сек] (в среднем)
Время на запрос: 18.190 [мс] (в среднем)
Время на запрос: 0.364 [мс] (в среднем, по всем одновременным запросам)
Скорость передачи: 7964.31 [Кбайт/сек] получено
С лучшими характеристиками сервера это могло бы быть намного быстрее.
Заключение
FrameworkX — это мощный, легковесный микро-фреймворк для PHP. Он работает асинхронно и способен эффективно обрабатывать множество задач, аналогично Node.js. Это идеальный фреймворк как для создания простых приложений, так и для сложных приложений с высокой одновременной нагрузкой или реального времени.