(注意:我在这里故意放置了不合适的websocket
标签,因为这是WebSocket专家了解Ratchet架构的最佳机会。)
我正在实施HTML5服务器端事件,我需要的是服务器端解决方案。由于挂起Apache的每个连接一个进程(连接池限制,内存消耗......)是不可考虑的,我希望棘轮项目可以提供帮助,因为它是大多数维护项目,他们有http
服务器连同其他组件。
我的问题是:我该如何使用它?不是用于升级http
请求(默认用法),而是用于提供动态生成的内容。
到目前为止我尝试了什么?
安装Ratchet
,如教程
测试了WebSocket功能 - 正常运行
遵循非常基本的说明given on page that describes http
server component:
/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文档似乎没有涵盖这一点。
答案 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
然后向所有人发送/广播。您可以对其进行修改并在发送时检查某些username
或uid
此时是否处于活动状态,并仅向其发送数据。您可以动态生成数据并发送给特定用户或所有用户。可能会有所帮助。