PHP 实现Comet服务端关于进程资源的疑惑?

zxyfaxcn
  • 9

前因

近期有一个项目需要基于PHP使用Comet方式实现一个http服务,在研读了swoole的文档后发现swoole_http_server支持异步模型,但没有相关示例代码,不明白具体的实现及原理。

个人理解

个人理解,无论是php-fpm模式,还是swoole_http_server,当收到请求后(onRequest),请求会交给worker进程来处理,而worker中的代码会有while + sleep 进行阻塞获取信息发送情况,那这样是不是代表一个worker只能处理一个链接,如果是,那worker数据是有限的(一台8G的服务器开的worker也只几百个),那这样一台这样配置的服务器是否代表只能处理几百个数量的Comet链接。

这里非常疑惑,希望能得到帮助

回复
阅读 1.2k
3 个回答
✓ 已被采纳

http://github.com/matyhtf/webim 这里就有 Comet 实现的代码。

它的原理是需要同时发起两个 Http 请求:

  • /pub 发布消息,这个请求会立即返回,并将消息写到一个 队列中,如果发现当前有正在 sub 的请求,可以直接唤起
  • /sub 订阅消息,如果消息队列中有内容,则取一条立即返回,如果没有则 hold 住请求,等待数据发送。为了防止连接被切断,这里可以设置一个超时时间,如 50s ,超过时间后,理解返回。重新发起一个新的 sub 请求

Swoole4 下因为有了协程,其实实现上更方便。消息队列直接用了 Coroutine\Channelsub请求直接读取channel。而hold请求也只需要Co::sleep睡眠即可。

@韩天峰 韩大,我的理解是否有误,comet需求基于swoole应该怎样处理比较合理呢.

同时只能处理一个连接是没错,但是当连接A操作数据库或者其它I/O操作时,连接A的协程会挂起,这时候唤起连接B的协程继续处理。也就是等待I/O时,会去干别的事,而不是干等着。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏