Как использовать Ratchet для ответа на серверные события HTML5?

(Примечание: я намеренно поставил неадекватный websocket отметьте здесь, так как это лучший шанс для специалистов по WebSocket узнать архитектуру Ratchet).

Я готов к реализации событий на стороне сервера HTML5, и мне нужно решение на стороне сервера. Поскольку зависание одного процесса Apache на соединение (ограничение пула соединений, потребление памяти...) не рассматривается, я надеялся, что проект Ratchet может помочь, так как это наиболее поддерживаемый проект, и они имеют http сервер в сочетании с другими компонентами.

Мой вопрос: как я могу это использовать? Не для обновления http запрос (использование по умолчанию), но для обслуживания динамически генерируемого контента.

Что я пробовал до сих пор?

  1. установлены Ratchet как объяснено в учебнике

  2. проверена функциональность WebSocket - работает нормально

  3. следовал очень простой набор инструкций, приведенных на странице, которая описывает 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 активен в данный момент и отправляет данные только им. Вы можете генерировать данные динамически и отправлять конкретным пользователям или всем. Может быть, это поможет.

Другие вопросы по тегам