adt / ratchet
用于 Nette 的 Ratchet IO 服务器的库
Requires
- php: >= 5.3.9
- cboden/ratchet: 0.3.*
- nette/nette: 2.*
- react/zmq: 0.2.*|0.3.*
- symfony/http-foundation: 2.5.5
This package is auto-updated.
Last update: 2024-09-26 11:30:39 UTC
README
实现 Ratchet 的 websocket 服务器到 Nette,http://socketo.me
特性
- 创建与 Ratchet 相同的
Component
,但使用 Nette 的所有便利功能 - 通过路由分离应用程序
- 在单个服务器上运行多个应用程序
- 创建同一应用程序的多个分离实例
安装扩展
- 通过 composer 安装: adt/ratchet
- 连接 DI 扩展 ADT\Ratchet\DI\RatchetExtension
它是如何工作的
服务器部分
在 server.php
中实现服务器部分与 index.php
非常相似
$container = require __DIR__ . '/../private/app/bootstrap.php';
$container->getByType('ADT\Ratchet\Server')->run();
启动服务器
php web/server.php
控制器
我们想要创建的每个应用程序都称为 Controller
。每个 Controller
实现了 Ratchet\ComponentInterface
的某些接口(就像任何 Ratchet Component
一样)。
路由器
ADT\Ratchet\Components\Router
用于分隔各个应用程序。路由可以方便地在 neon 中设置
ratchet:
routes:
'/kittenSubscriber': @\App\RatchetModule\Controllers\IKittenControllerFactory
# nebo podrobně
'/kittenSubscriber':
controller: @\App\RatchetModule\Controllers\IKittenControllerFactory
httpHost: NULL
instantionResolver: @\App\RatchetModule\Controllers\InstantionResolver
基本路由由 path
-controller
对组成。可以指定 Controller
为直接作为服务或作为实现 create()
函数的工厂。
通过指定 httpHost
来指定路由将为其工作的特定域名。
在某些情况下,我们希望为用户组中的每个用户创建一个自己的 Controller
实例。例如,为多个子域运行相同的应用程序。比在 Controller
中处理所有内容更方便的方式是使用 instantionResolver
参数。该参数是实现了 ADT\Ratchet\Controllers\IInstantionResolver
接口的类。最好的方式是看看 InstantionResolver
的实现示例。以下 InstantionResolver
的实现将确保为每个子域创建(当然,是延迟的)自己的 Controller
实例
<?php
namespace App\RatchetModule\Controllers;
use \Ratchet\ConnectionInterface;
use \Guzzle\Http\Message\RequestInterface;
class InstantionResolver implements \ADT\Ratchet\Controllers\IInstantionResolver {
public function getInstantionIdentifier(RequestInterface $request, ConnectionInterface $conn) {
$origin = new \Nette\Http\Url($request->getHeader('origin')->toArray()[0]);
return $origin->host;
}
}
集成到现有应用程序中
TODO: ZMQ 模型
调试
TODO: ADT\Dumper,创建一个 Debug 组件,让一个用户订阅并接收所有输出 (_debug)
TODOs
-
将
autoDestroy
选项添加到配置中:如果 Controller 是动态创建的并且所有用户都已断开连接,则删除 Controller 实例。 -
基准测试:比较 NodeJS 和 Ratchet。对单个请求的响应速度(如果两者都是 1ms,则忽略,但如果一个是 200ms,另一个是 1ms,则这是错误的)。响应在 99% 的情况下是 1-2ms(可能还包括一些 JS 负载)。
-
我希望我们的控制器不要分散到必须将一切分为子域。如果有人连接到特定的子域,他们不能与任何人通信。但是,每个浏览器都可以连接到其子域的所有控制器以及域的所有控制器。Controller 不会处理子域,并假定其不会收到来自其他子域的请求 -> 这需要在较低层解决。
-
路由器不应直接接收 Controller,而应根据参数(在我的情况下是子域)决定是否创建新的 Controller 或如果为子域存在则返回现有 Controller。
-
路由
- 路径
- 控制器类名
- 回调,根据路由参数返回一个唯一的标识符
-
将 RatchetModel(或 LockController 中的 ZMQ\Context)与子域控制分离
感谢
该项目是 frosty22/ratchet 的未完成项目的扩展。感谢启发。