В течение последних нескольких лет 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:
- Проверьте представление Wiedler .
- Просмотрите примеры на веб-сайте React .
Изображение через Fotolia