adt/ratchet

用于 Nette 的 Ratchet IO 服务器的库

v1.0 2015-10-02 07:02 UTC

This package is auto-updated.

Last update: 2024-09-26 11:30:39 UTC


README

实现 Ratchet 的 websocket 服务器到 Nette,http://socketo.me

特性

  1. 创建与 Ratchet 相同的 Component,但使用 Nette 的所有便利功能
  2. 通过路由分离应用程序
  3. 在单个服务器上运行多个应用程序
  4. 创建同一应用程序的多个分离实例

安装扩展

  1. 通过 composer 安装: adt/ratchet
  2. 连接 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

  1. autoDestroy 选项添加到配置中:如果 Controller 是动态创建的并且所有用户都已断开连接,则删除 Controller 实例。

  2. 基准测试:比较 NodeJS 和 Ratchet。对单个请求的响应速度(如果两者都是 1ms,则忽略,但如果一个是 200ms,另一个是 1ms,则这是错误的)。响应在 99% 的情况下是 1-2ms(可能还包括一些 JS 负载)。

  3. 我希望我们的控制器不要分散到必须将一切分为子域。如果有人连接到特定的子域,他们不能与任何人通信。但是,每个浏览器都可以连接到其子域的所有控制器以及域的所有控制器。Controller 不会处理子域,并假定其不会收到来自其他子域的请求 -> 这需要在较低层解决。

  4. 路由器不应直接接收 Controller,而应根据参数(在我的情况下是子域)决定是否创建新的 Controller 或如果为子域存在则返回现有 Controller。

  5. 路由

    • 路径
    • 控制器类名
    • 回调,根据路由参数返回一个唯一的标识符
  6. 将 RatchetModel(或 LockController 中的 ZMQ\Context)与子域控制分离

感谢

该项目是 frosty22/ratchet 的未完成项目的扩展。感谢启发。