Статьи

Первый взгляд на реакцию

В течение последних нескольких лет Node.js привлекает все больше внимания как перспективная веб-технология. Хотя у него есть некоторые сильные стороны, такие как управляемость событиями, некоторые люди просто хотят придерживаться PHP. Однако уже более года существует аналогичный проект для PHP под названием React .

React в основном закодирован Игорем Видлером , который также является выдающимся автором Silex . Читая примеры React, он действительно похож на Node.js.

Как и Node.js, вам рекомендуется писать приложения для асинхронного выполнения. Для тех, кто не знаком с асинхронным программированием, сервер отвечает на запросы одним потоком, но использует рабочие потоки для выполнения трудоемких задач, таких как запись в файл, чтение из базы данных, получение результатов из API Twitter и т. Д. Когда задача завершена, рабочий возвращает результат в основной поток, который завершает запрос. Этот стиль программирования может дать огромный прирост скорости.

Получение Реакции

React доступен с Composer через Packagist (если вы не знакомы с работой с Composer, ознакомьтесь с моей предыдущей статьей ). Чтобы установить React, создайте новый файл composer.json со следующим содержимым:

 { "require": { "react/react": "0.2.*" } } 

Откройте консоль, перейдите туда, где находится файл, и запустите php composer install . React и его зависимости будут извлечены и затем могут быть использованы путем включения файла vendor/autoload.php .

Создание простого сервера

С Node.js вы создаете серверный скрипт самостоятельно, а не используете серверное приложение, такое как Apache или Nginx. Вы настраиваете функцию события, определяете порт, который будет прослушивать ваш сервер, а затем ждете запросов. С каждым запросом выполняется функция события. Это то же самое в Реакте.

Этот пример взят из файла README.md проекта React:

 <?php require_once 'vendor/autoload.php'; $i = 0; $app = function ($request, $response) use (&$i) { $i++; $text = "This is request number $in"; $headers = array('Content-Type' => 'text/plain'); $response->writeHead(200, $headers); $response->end($text); }; $loop = ReactEventLoopFactory::create(); $socket = new ReactSocketServer($loop); $http = new ReactHttpServer($socket); $http->on('request', $app); $socket->listen(1337); $loop->run(); 

Сначала он включает файл автозагрузчика Composer, а затем устанавливает нулевую переменную $i которая будет использоваться для подсчета запросов. Затем, что является не слишком распространенной практикой в ​​сообществе PHP, наша функция обработки событий, которая будет обрабатывать все входящие запросы, сохраняется в переменной. Функция устанавливает заголовки ответа и печатает количество обработанных запросов.

Сценарий создает цикл обработки событий, который обрабатывает неблокированный ввод-вывод для нас, сокета и затем сервера. Наконец, функция события назначена, сокет настроен на прослушивание порта 1337, и цикл событий запускается.

Если вы сохраните код как server.php и запустите его из командной строки с помощью php server.php , а затем перейдите в браузере по адресу http: // localhost: 1337 , вы увидите ответ. Не забудьте проверить свою командную строку, чтобы увидеть, сколько запросов было обработано!

Изучение реакции дальше

React может сделать гораздо больше, чем просто выполнять роль HTTP-сервера. Мы можем использовать его для более крутых вещей. Подумайте об этом примере: вы шпион ЦРУ и хотите передать данные своему боссу. Босс создает сервер, вы подключаетесь как клиент через сокет, и все, что вы вводите, записывается в журнал сервера.

Поддержка сокетов обрабатывается компонентом сокетов в React, и для этого примера вам не нужна полная библиотека React. Следующего composer.json должно быть достаточно:

 { "require": { "react/socket": "0.2.*" } } 

И это пример кода:

 <?php require_once 'vendor/autoload.php'; $loop = ReactEventLoopFactory::create(); $socket = new ReactSocketServer($loop); $socket->on('connection', function ($conn) use ($loop) { $conn->write("Successfully connected to the writing servern"); echo 'client connected'; $dataStream = new ReactStreamStream(fopen('data.txt', 'w'), $loop); $conn->on('data', function($data) use ($conn, $dataStream) { $dataStream->write($data); }); $conn->on('end', function() { echo 'connection closed'; }); }); $socket->listen(4000); $loop->run(); 

Мы снова создаем цикл обработки событий, а затем создаем сокет. Когда происходит событие подключения, мы печатаем сообщение на консоль. Мы создаем новый поток записи и $dataStream его $dataStream а когда мы получаем данные, мы проталкиваем его вниз по потоку, и данные записываются в наш файл. Когда клиент отключается, поток закрывается.

После запуска php server.php вы можете подключиться с помощью nc localhost 4000 . Все, что вы вводите и затем нажимаете ввод, регистрируется в data.txt .

Кто будет использовать React?

Итак, React предлагает действительно потрясающую функциональность, но зачем вам использовать младшую библиотеку, которая еще не стабильна, вместо более зрелой Node.js, которая также имеет большое сообщество? Я думал об этом сам, поэтому я спросил Игоря Видлера:

Я бы не советовал запускать реакцию на производстве на этом этапе. Некоторые из частей более низкого уровня довольно стабильны, вещи более высокого уровня не так уж и много. Целевая аудитория сейчас — люди, которые любят экспериментировать с передовыми технологиями и не боятся отлаживать вещи, когда они ломаются. В частности: мне интересно иметь новые библиотеки, основанные на цикле событий реакции, чтобы их можно было использовать вместе.

Вывод

Является ли React интересным проектом? Я так думаю, даже если он просто портирует функциональность Node.js, он делает это круто, и кто бы мог подумать, что такие вещи вообще можно делать в PHP? По крайней мере, я этого не сделал.

React выглядит как многообещающий проект, хотя он еще не готов к производству, у него, похоже, есть несколько интересных функций и хороший разработчик для его поддержки. Конечно, я не могу объяснить все аспекты React в этой короткой статье, поэтому, если вы хотите узнать больше о React:

Изображение через Fotolia