php 没有提供 WebSocket 服务器功能,所以自己写的话只能用循环等待的方式。显然空转也是要消耗资源的
如果你的服务器是 Linux 系统,那么可以在网上找到 php 结合系统功能的 WebSocket 服务器。开源的,据说性能还不错
如果你的服务器是 windows 的,那么最好不要用纯 php 代码去做,不然日后会遇到很多麻烦,不是 php 层面可以解决的
所以如果真的要自己写 WebSocket 服务器的话,建议你使用 node.js,至少不需要再学一门语言
使用 node.js 写 WebSocket 服务器,实现基本功能只需 4~5 行代码
其他问题你基本上都考虑到了,到实战时逐一解决吧
前面看到一个200W下用户免费的一个第三方IM,它是用的长连接。
你用PHP socket来做,全部靠PHP可能不太现实,配合着系统脚本来做呢。。。
我也没去真正研究过。。。
可以直接用这个,性能很强悍,pc四核长链接qps为15W/S,单服务器轻松支撑几万客户端
主页: http://www.workerman.net/,上面有很多websocket的例子,包括游戏
源码: https://github.com/walkor/workerman
针对你的问题回答如下:
1\ 它是非阻塞+IO复用(Epoll),服务器模型类似nginx,性能非常好
2\ 自带进程控制,php your_file.php start -d 自动进入daemon模式, php your_file.php stop 停止,php your_file.php status 查看状态
3\ 支持变量或者资源永久保持,变量放到内存中,当然也可以放到mysql redis等存储里面
4\ 可以独立与原有web系统单独部署,它的GatewayWorker模型天然支持分布式部署
5\ 如果子进程挂掉可以自动拉起,通过status能看到进程是否挂掉、挂掉几次。它也有statistics监控应用,可以监控各个业务接口成功率、调用曲线、耗时等等
附上websocket服务端demo:
count = 4;// Emitted when new connection come$ws_worker->onConnect = function($connection){ // Emitted when websocket handshake done $connection->onWebSocketConnect = function($connection) { echo "New connection\n"; };};// Emitted when data received$ws_worker->onMessage = function($connection, $data){ // Send hello $data $connection->send('hello ' . $data);};// Emitted when connection closed$ws_worker->onClose = function($connection){ echo "Connection closed\n";};// Run workerWorker::runAll();
换个GO 玩玩....
swoole或者workerman 如果纯使用不研究源码。推荐swoole否则workerman
可以直接用这个,性能很强悍,pc四核长链接qps为15W/S,单服务器轻松支撑几万客户端
主页: http://www.workerman.net/,上面有很多websocket的例子,包括游戏
源码: https://github.com/walkor/workerman
针对你的问题回答如下:
1\ 它是非阻塞+IO复用(Epoll),服务器模型类似nginx,性能非常好
2\ 自带进程控制,php your_file.php start -d 自动进入daemon模式, php your_file.php stop 停止,php your_file.php status 查看状态
3\ 支持变量或者资源永久保持,变量放到内存中,当然也可以放到mysql redis等存储里面
4\ 可以独立与原有web系统单独部署,它的GatewayWorker模型天然支持分布式部署
5\ 如果子进程挂掉可以自动拉起,通过status能看到进程是否挂掉、挂掉几次。它也有statistics监控应用,可以监控各个业务接口成功率、调用曲线、耗时等等
附上websocket服务端demo:
count = 4;// Emitted when new connection come$ws_worker->onConnect = function($connection){ // Emitted when websocket handshake done $connection->onWebSocketConnect = function($connection) { echo "New connection\n"; };};// Emitted when data received$ws_worker->onMessage = function($connection, $data){ // Send hello $data $connection->send('hello ' . $data);};// Emitted when connection closed$ws_worker->onClose = function($connection){ echo "Connection closed\n";};// Run workerWorker::runAll();