Как использовать Ratchet для ответа на серверные события HTML5?
(Примечание: я намеренно поставил неадекватный websocket
отметьте здесь, так как это лучший шанс для специалистов по WebSocket узнать архитектуру Ratchet).
Я готов к реализации событий на стороне сервера HTML5, и мне нужно решение на стороне сервера. Поскольку зависание одного процесса Apache на соединение (ограничение пула соединений, потребление памяти...) не рассматривается, я надеялся, что проект Ratchet может помочь, так как это наиболее поддерживаемый проект, и они имеют http
сервер в сочетании с другими компонентами.
Мой вопрос: как я могу это использовать? Не для обновления http
запрос (использование по умолчанию), но для обслуживания динамически генерируемого контента.
Что я пробовал до сих пор?
установлены
Ratchet
как объяснено в учебникепроверена функциональность WebSocket - работает нормально
следовал очень простой набор инструкций, приведенных на странице, которая описывает
http
серверный компонент:
/bin/http-server.php
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
require dirname(__DIR__) . '/vendor/autoload.php';
$http = new HttpServer(new MyWebPage);
$server = IoServer::factory($http);
$server->run();
Не нужно быть экспертом, чтобы понять, что MyWebPage
класс должен быть объявлен для того, чтобы сервер работал, но как?
Документация Ratchet не покрывает это.
2 ответа
Ваш MyWebPage
класс должен реализовать HttpServerInterface
, Поскольку это будет простой запрос / ответ, вам нужно отправить ответ, а затем закрыть соединение в onOpen()
метод вашего класса:
<?php
use Guzzle\Http\Message\RequestInterface;
use Guzzle\Http\Message\Response;
use Ratchet\ConnectionInterface;
use Ratchet\Http\HttpServerInterface;
class MyWebPage implements HttpServerInterface
{
protected $response;
public function onOpen(ConnectionInterface $conn, RequestInterface $request = null)
{
$this->response = new Response(200, [
'Content-Type' => 'text/html; charset=utf-8',
]);
$this->response->setBody('Hello World!');
$this->close($conn);
}
public function onClose(ConnectionInterface $conn)
{
}
public function onError(ConnectionInterface $conn, \Exception $e)
{
}
public function onMessage(ConnectionInterface $from, $msg)
{
}
protected function close(ConnectionInterface $conn)
{
$conn->send($this->response);
$conn->close();
}
}
Я закончил тем, что использовал Ratchet\App
класс вместо Ratchet\Http\HttpServer
потому что это позволяет вам настроить маршрутизацию среди прочего, так что ваш /bin/http-server.php
будет выглядеть так:
<?php
use Ratchet\App;
require dirname(__DIR__) . '/vendor/autoload.php';
$app = new App('localhost', 8080, '127.0.0.1');
$app->route('/', new MyWebPage(), ['*']);
$app->run();
Когда ты бежишь php bin/http-server.php
и посетите http://localhost:8080/, вы должны увидеть Hello World! ответ в вашем браузере.
Это все, что вам нужно для базовой системы запросов / ответов, но ее можно расширить, внедрив шаблоны HTML и тому подобное. Я сам реализовал это в небольшом тестовом проекте, который я загрузил на github вместе со многими другими вещами, включая абстрактный контроллер, который я могу расширить для разных страниц.
Чат-сервер с помощью Ratchet - Basic
Чат-сервер с помощью Ratchet - Advanced
Проверьте ссылку выше. Парень здесь использует Ratchet для создания сервера чата в реальном времени. Он в основном хранит usernames
сначала а потом отправка / трансляция всем. Вы можете изменить его и проверить во время отправки этого определенного username
или же uid
активен в данный момент и отправляет данные только им. Вы можете генерировать данные динамически и отправлять конкретным пользователям или всем. Может быть, это поможет.