前因
近期有一个项目需要基于PHP使用Comet方式实现一个http服务,在研读了swoole的文档后发现swoole_http_server支持异步模型,但没有相关示例代码,不明白具体的实现及原理。
个人理解
个人理解,无论是php-fpm模式,还是swoole_http_server,当收到请求后(onRequest),请求会交给worker进程来处理,而worker中的代码会有while + sleep 进行阻塞获取信息发送情况,那这样是不是代表一个worker只能处理一个链接,如果是,那worker数据是有限的(一台8G的服务器开的worker也只几百个),那这样一台这样配置的服务器是否代表只能处理几百个数量的Comet链接。
这里非常疑惑,希望能得到帮助
http://github.com/matyhtf/webim 这里就有 Comet 实现的代码。
它的原理是需要同时发起两个 Http 请求:
/pub
发布消息,这个请求会立即返回,并将消息写到一个 队列中,如果发现当前有正在 sub 的请求,可以直接唤起/sub
订阅消息,如果消息队列中有内容,则取一条立即返回,如果没有则 hold 住请求,等待数据发送。为了防止连接被切断,这里可以设置一个超时时间,如 50s ,超过时间后,理解返回。重新发起一个新的 sub 请求在
Swoole4
下因为有了协程,其实实现上更方便。消息队列直接用了Coroutine\Channel
,sub
请求直接读取channel
。而hold
请求也只需要Co::sleep
睡眠即可。