Как использовать 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, похоже, не распространяется на это.


person Miloš Đakonović    schedule 28.12.2015    source источник
comment
Вы когда-нибудь добились чего-нибудь с этим?   -  person Andy    schedule 30.07.2016
comment
@Энди, к сожалению, нет.   -  person Miloš Đakonović    schedule 30.07.2016
comment
Вчера я играл с этим весь день, и теперь у меня есть базовый рабочий HTTP-сервер. Я опубликую ответ в течение следующих нескольких дней, как только немного приведу все в порядок.   -  person Andy    schedule 31.07.2016


Ответы (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. наряду со многими другими вещами, включая абстрактный контроллер, который я могу расширить для разных страниц.

person Andy    schedule 31.07.2016
comment
Похоже, именно то, что я ищу - спасибо за ваши усилия. Я приму ваш ответ сразу после того, как проверю ваш код - пока голосуйте. - person Miloš Đakonović; 01.08.2016
comment
@Miloshio Проект Github также содержит гораздо больше функций, чем этот ответ - он может обслуживать шаблоны HTML, а не просто простой текстовый ответ. Есть еще несколько вещей, таких как объект конфигурации для получения и установки значений конфигурации, а также регистратор :) /RatchetWebServer/Controller/HomeController.php" rel="nofollow noreferrer">HomeController показывает, как использовать объект запроса. - person Andy; 01.08.2016
comment
Да, это полнофункциональный http-сервер. Теперь я должен реализовать Content-Type: text/event-stream и пульсирующие обновления. Большое спасибо. Я разветвлю ваш проект на Github. - person Miloš Đakonović; 02.08.2016

Сервер чата с использованием Ratchet — Basic

Сервер чата с использованием Ratchet — расширенный

Проверьте ссылку выше. Этот парень использует Ratchet для создания чат-сервера в реальном времени. В основном он сначала сохраняет usernames, а затем отправляет/рассылает всем. Вы можете изменить его и проверить в момент отправки, что определенные username или uid активны в данный момент и отправлять данные только им. Вы можете динамически генерировать данные и отправлять их отдельным пользователям или всем. Может быть, это поможет.

person Yomesh    schedule 28.12.2015