如何使用Ratchet响应HTML5服务器端事件?

时间:2015-12-28 15:34:53

标签: php websocket ratchet

(注意:我在这里故意放置了不合适的websocket标签,因为这是WebSocket专家了解Ratchet架构的最佳机会。)

我正在实施HTML5服务器端事件,我需要的是服务器端解决方案。由于挂起Apache的每个连接一个进程(连接池限制,内存消耗......)是不可考虑的,我希望棘轮项目可以提供帮助,因为它是大多数维护项目,他们有http服务器连同其他组件。

我的问题是:我该如何使用它?不是用于升级http请求(默认用法),而是用于提供动态生成的内容。

到目前为止我尝试了什么?

  1. 安装Ratchet,如教程

  2. 中所述
  3. 测试了WebSocket功能 - 正常运行

  4. 遵循非常基本的说明given on page that describes http server component

  5. /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 个答案:

答案 0 :(得分:3)

您的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

当您运行<sql:query dataSource="${snapshot}" var="result"> SELECT * from forum where id=<%= request.getParameter("id") %>; </sql:query> <c:forEach var="row" items="${result.rows}"> <input type="text" name="title" value="RE: <c:out value="${row.title}"/>"/> <br/> <textarea name="answertext" cols="50" rows="5"></textarea> <br/> <input type="hidden" name="answer_id" value="<%= request.getParameter("Id")%>"> 并访问http://localhost:8080时,您应该会看到Hello World!在浏览器中回复。

这是基本请求/响应系统所需的全部内容,但可以通过实现HTML模板等方式进一步扩展。我已经在一个test project中实现了这一点,我已将其与许多其他内容一起上传到github,包括一个抽象控制器,我可以将其扩展到不同的页面。

答案 1 :(得分:-1)

Chat server using Ratchet - Basic

Chat server using Ratchet - Advanced

检查上面的链接。这里的人正在使用Ratchet构建一个实时聊天服务器。他最初基本上存储usernames然后向所有人发送/广播。您可以对其进行修改并在发送时检查某些usernameuid此时是否处于活动状态,并仅向其发送数据。您可以动态生成数据并发送给特定用户或所有用户。可能会有所帮助。