php fd_size,关于PHP Websocket 错误: "stream_select(): You MUST recompile PHP with a larger value of FD_...

最近在使用Ratchet (一个PHP websocket框架)改造一个PHP网站的时候,出现了错误:

"It is set to 1024, but you have descriptors numbered at least as high as

1266.

--enable-fd-setsize=2048 is recommended, but you may want to set it

to

equal the maximum number of open files supported by your system"

经过几番周折,发现原因是PHP源代码将FD_SIZE设置为1024了,一旦超过1024个websocket连接,就会报这个错。网上的解决方案,基本上是修改PHP源代码,重新编译PHP.

但是个人认为修改PHP源代码的做法存在风险,故我提出了新的思路,并在项目中成功运用(欢迎拍砖)。

基本原理是在后台多开几个websocket服务进程,每个进程用不同的端口号。而前台js随机连接后台开放的websocket服务进程端口号。这样每个websocket服务进程有1024的可用连接数,根据网站的峰值连接数计算可得所需开的websocket服务进程数量,当然需要留些余量。这样不需要重新编译PHP源代码,也能够轻松突破PHP

websocket 1024个连接数限制了。

后台的实现

写一个push-server.php作为websocket服务,

push-server的实现可以参照Ratchet的例子, 但是需要稍微改造下,即可以输入port作为命令行参数。

根据需要,可以启动多个websocket进程,如:

php push-server 40003

php push-server 40004

php push-server 40005

这样后台就可以容许 1024 * 3 = 3072个websocket连接了。

前台的实现

随机获取连接服务的代码如下:

69c5a8ac3fa60e0848d784a6dd461da6.png

functiongetWSServer() {var serverPorts = [‘40003‘, ‘40004‘, ‘40005‘];var server = ‘ws://youhost‘;var randomPortIndex = Math.floor(Math.random() *serverPorts.length);

server+= ‘:‘ +serverPorts[randomPortIndex];returnserver;

};

69c5a8ac3fa60e0848d784a6dd461da6.png

当然你也可以根据自己需要,指定什么时候连接某个websocket服务,不再赘述。

原文:http://www.cnblogs.com/jimma/p/php_fd_size_limitation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值