noflash/tinyws

该包已被废弃,不再维护。未建议替代包。

高性能、灵活、RFC兼容且文档齐全的WebSocket服务器库。

dev-master 2021-02-04 04:34 UTC

This package is auto-updated.

Last update: 2021-03-04 04:41:19 UTC


README

遗憾的是我没有时间维护这个项目(包括CherryHTTP)。到目前为止,我还没有找到快速替代方案。然而,我不能再假装这老旧的代码适合在生产环境中使用;)

TinyWs

高性能、灵活、RFC兼容且文档齐全的WebSocket服务器库。它遵循MIT许可协议,因此可以在任何项目中免费使用(即使是商业项目)。尽管代码库存在时间不长,但代码已准备好用于生产。实际上,许多人每天都在积极使用它,因此我决定将其开源,使互联网成为一个更好的地方。

市面上有很多PHP WebSocket库。不幸的是,其中大多数都不如它们看起来那么好。其中一些相当不错,但它们的许可证不允许灵活的商业级使用。认识我的人都知道我是一个性能狂热者,这一点也反映在那个项目中。TinyWs并不完美,它有一些限制。然而,这些限制并没有真正限制其使用。

支持什么和不支持什么?

WebSocket协议长期以来一直是一个不安全且存在漏洞的混乱。自从RFC 6455以来,情况发生了变化——它可以被认为是一个相当好的协议。库几乎100%符合RFC(请参阅测试。)并且只支持第13版协议。不支持旧版本(它们已经被废弃了)。

然而,由于缺乏时间,一些功能尚未实现

  • SSL:正在进行中
  • 深度配置:一些参数无法配置(例如最大负载)
  • IPv6:应该可以工作,但不能算作已测试
  • Origin:当前服务器忽略origin并接受任何来源
  • 自动分段:这不是限制,但缺少改进(但很难正确实现)
  • 协议扩展:目前没有实际用途(除了每包压缩)
  • 数据包压缩:更像是Chrome的实验,缺点多于优点
  • 通过SPDY的WebSocket:目前仅是一个实验
    您可以将上面的列表视为一个小型路线图,而不是反对使用此库的论据;)

用法

要求

  • PHP >=5.3(推荐使用5.6+,因为性能改进)
  • PHP模块:OpenSSL、mbstring
  • CherryHttp
  • PSR-3接口
  • 建议使用PSR-3兼容的日志记录器(例如轻量级的Shout

安装

使用Composer

由于简单性和自动依赖关系管理,Composer是首选的安装方法。

  1. 当然需要composer - 安装只需不到一分钟
  2. 在您最喜欢的终端中运行 php composer.phar require noflash/tinyws:dev-master 来安装TinyWs及其依赖项
  3. vendor/autoload.php 包含在您的应用程序源代码中
  4. 如果您想查看服务器日志,则需要安装 符合PSR-3的日志记录器,例如 php composer.phar require noflash/shout

手册

详细信息将很快提供。
基本上,您需要下载 CherryHttpPSR-3接口符合PSR-3的日志记录器。然后,将它们放入目录(例如,vendor)中,并包含所有文件(或使用符合PSR-4的自动加载器)。有关详细信息,请参阅示例README

基本用法

每次消息到达、客户端连接/断开连接或发生某种类型的异常时,TinyWs都会调用您的自己的 "ClientsHandler"。它只是一个实现(文档良好)ClientsHandlerInterface 接口的对象。为了简化在真正基本的应用程序中的使用,您也可以仅扩展 AbstractClientsHandler 并仅实现 onMessage() 方法。
这有多简单?请参阅echo服务器实现

常见问题解答

它稳定吗?

在将库发布到GitHub之前很久,它已在各种条件下进行了测试。它已在具有多个用户并使用不同软件配置的商业应用程序中证实可以无缝运行。

它足够快,可以放置场景吗?

代码的每一部分都是考虑到性能而编写的。市场上没有比基于PHP的WebSocket服务器更快的了;)

注意

  • 在生产环境中禁用X-Debug(这非常重要)。您需要在php.ini中注释掉模块(将xdebug.*设置为0是不够的)。
  • 使用*nix操作系统 - 在Windows上处理大量连接效率不高。

您能添加放置功能名称吗?

每个功能请求都将被考虑。库正在积极开发中,但我无法立即自己实现所有内容,因此欢迎拉取请求。

它在HHVM环境中工作吗?

遗憾的是,我没有与该平台的专业经验,因此无法提供任何保证。

为什么配置使用常量?这与面向对象编程(OOP)相矛盾!

我花了很多时间重新思考并重构库的这一部分,并且出于许多原因它最终是这样的。
首先,您需要知道多用户网络服务与标准PHP有很大不同。因为它使用I/O多路复用来处理多个连接,并且只使用单个线程(更多内容请参阅内部笔记部分),所以在同一时间只能运行一个服务器实例。
由于没有实际使用多个服务器实例的情况,因此也不值得支持每个实例的配置(这会显著降低性能)。

内部笔记(针对黑客)

它是如何工作的?

在您开始思考理解该库的内部机制之前,您必须了解协议构造。最好阅读整个RFC 6455。预计这里将出现一个简单的图表,以展示整体的应用流程。同时,您可以检查代码本身——它使用行业标准phpDocumentor进行了良好的文档记录。

多连接处理机制

为什么一些方法使用类型提示而另一些则不使用?

这些问题在CherryHttp README中有详细说明。