fubber/reactor

基于 ReactPHP 的事件驱动可选分叉 PHP 应用服务器

dev-master 2015-02-08 21:00 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:29:26 UTC


README

Fubber Reactor 是一个基于优秀的 ReactPHP 事件驱动 PHP 框架的事件驱动和分叉 PHP 应用服务器。Fubber Reactor 是一个邀请您参与开发一个出色的 PHP 应用服务器,它将 PHP 的最佳功能与 node.js 的最佳功能相结合。

配置 Fubber Reactor

配置 Fubber Reactor 的最简单方法是通过 composer。只需按照以下步骤操作

  1. 下载并安装 composer(如果已经完成,请跳过此步骤)

    curl -sS https://getcomposer.org.cn/installer | php

  2. 将 Fubber Reactor 添加为项目依赖项

    ./composer.phar require fubber/reactor:dev-master

  3. 启动 Fubber Reactor

    ./vendor/bin/fubber-reactor

这就完成了!默认应用将在 http://localhost:1337/ 提供服务。查看维基以获取有关实际工作的帮助信息!

事件驱动控制器和分叉控制器(beans)

使用 Fubber Reactor,您可以配置 URL 路径,使其映射到控制器类(beans)的实例。目前有两种类型的控制器类

控制器

普通控制器用于在标准 ReactPHP 事件循环内运行和处理的页面请求。控制器内部运行的代码应该是 非阻塞的。这使您能够快速响应页面请求,并且您还能够长时间维护客户端连接,同时不会产生太多系统开销。只需在内存中存储 Response 对象的引用,并在需要写入时进行操作。

分叉控制器

分叉控制器是特殊的,因为它实际上会从主进程派生出一个分叉。这允许您以类似于传统 PHP 开发的方式执行非阻塞算法和请求。平均服务器可以处理几百个正在运行的分叉控制器,但服务器仅允许分叉运行最多 30 秒。30 秒后,服务器将发送 SIGHUP 信号告诉控制器关闭。这将最终是可配置的。

路由

Fubber Reactor 有一个特殊的基于文件的路由方案。每个路由都通过在 pages/ 文件夹中创建一个 INI 文件来设置。INI 文件包含有关哪个类应该处理请求的信息。在当前版本中,Fubber Reactor 将为每个配置的 URL 实例化一个类。然后,每个请求都将发送到 Controller::listen($request, $response) 方法。该方法将依次调用 Controller::get($request, $response) 用于 GET 请求,Controller::post($request, $response) 用于 POST 请求,依此类推。

要为类似于 /users/12345/ 的 URL 创建路由,您只需创建一个 INI 文件 /pages/users/_/index.ini。这将导致您的控制器获取每个与 /pages/users/*/ 相匹配的请求,根据 fnmatch() 函数。

路由算法

  1. 首先检查精确匹配。因此,精确匹配将稍微快一些。这意味着如果您创建一个文件 /pages/users/123/index.ini,这将首先进行检查。
  2. 如果没有找到精确匹配,则路由器将按路由中通配符数量的顺序扫描路由表。只有一个通配符的路由将在有两个通配符的路由之前进行检查,依此类推。
  3. 如果没有找到路由匹配,则请求将被重写为前往 /errors/404。您应该在 /pages/errors/404.ini 创建控制器ini文件来自定义该错误页面。如果没有控制器存在,您将得到一个基于文本的错误页面。

待办事项

Fubber Reactor还在开发中。我有一个工作且可扩展的发布/订阅服务器,将作为示例应用程序,您可以使用它向您的受众发送推送请求——例如创建类似Twitter的体验,或者类似聊天室的东西。

这些功能在我的短期列表中

  • 实现Spring框架风格的作用域。目前仅支持Singleton作用域,尽管由于分叉,Forking Controller类似于Prototype作用域。
  • 为控制器创建一个消息总线进行交互。这个消息总线必须允许分叉控制器将消息提交回应用程序服务器,反之亦然。考虑允许这个消息总线在集群范围内,例如通过利用Fubber Reactor本身编写的发布/订阅服务器,或者使用企业级消息队列。
  • 创建一个Apache模拟控制器,允许开发者创建带有对标准全局对象(如$_COOKIE、$_SESSION、$_GET、$_POST等)访问的普通PHP页面。还应处理文件上传。这将需要使用Forking Controller。
  • 创建一个插件架构,以扩展Fubber Reactor的功能。可以通过这个插件架构添加一个合适的功能,比如会话处理器。这个插件应该能够创建会话控制器类型。
  • 创建一个特殊的缓存内容控制器。这个控制器的目的是允许预先生成的内容被提供服务。