关于PHP Websocket 错误: "stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE" 的解决方案
最近在使用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作为命令行参数。
$port = $argv[1];
if ($port == ""){
$port = 40003; // 默认端口,如果启动push-server.php时不写参数,则使用40003端口
}
// .....省略其他代码 ..... // 将$port作为监听端口传入
$webSock->listen($port, '0.0.0.0');
根据需要,可以启动多个websocket进程,如:
php push-server 40003
php push-server 40004
php push-server 40005
这样后台就可以容许 1024 * 3 = 3072个websocket连接了。
前台的实现
随机获取连接服务的代码如下:
function getWSServer() {
var serverPorts = ['40003', '40004', '40005'];
var server = 'ws://youhost';
var randomPortIndex = Math.floor(Math.random() * serverPorts.length);
server += ':' + serverPorts[randomPortIndex];
return server;
};
当然你也可以根据自己需要,指定什么时候连接某个websocket服务,不再赘述。
关于PHP Websocket 错误: "stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE" 的解决方案的更多相关文章
- webSocket错误收集
关于 使用WebSocket报如下错误, Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': already in ...
- Websocket————错误总结
websocket 一.需要注意的是,js建立连接处完整的js代码要执行完成退出后才会真正发起建立连接请求,如果在此之前发送消息则会报错如下: InvalidStateError: An attemp ...
- mybatis(错误一) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案
Result Maps collection already contains value for xyx.dsw.dao.mapper.admin.quotationwish.TempTestTab ...
- IIS7虚拟目录出现HTTP错误500.19(由于权限不足而无法读取配置文件)的解决方案
今天在window7上配置asp.net网站,但是访问总是提示 错误摘要HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效.详细 ...
- 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案
假设在C:\Java\code\目录下建立了如下 Test.java文件: package code; public class Test { public static void main(Stri ...
- 使用Git出现以下错误"Git@github.com: Permission denied (publickey). Could not read from remote repository."解决方案
转载于:https://blog.csdn.net/dotphoenix/article/details/100130424 git@github.com: Permission denied (pu ...
- WCF错误远程服务器返回了意外响应: (413) Request Entity Too Large。解决方案
这个问题出现的原因是 调用wcf服务的时候传递的参数 长度太大 wcf数据传输采用的默认的大小是65535字节. ---------------------------------------- ...
- eclipse 创建maven web错误Cannot change version of project facet Dynamic web module to 3.1解决方案
Dynamic Web Module 选择“3.1”,java选择“1.8”,报错:Cannot change version of project facet Dynamic web module ...
- html websocket
from:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ websocket 规范升级过,在该链接的文章内未提及,后面 ...
随机推荐
- 1.6.1 什么是 Indexing
这部分描述了建立索引的过程:添加内容到solr索引中,如果有需要,修改内容或者删除它.通过添加内容到索引里边,我们使其内容可以搜索. solr索引能够接收不同来源的数据,xml文件,逗号分隔值的(CV ...
- Java异常的一个小知识
有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...
- Session共享的简单总结
1.同服务器.同一域名.不同应用(端口.虚拟目录等) 这种很简单,把sessionState保存到SQLServer,aspnet_regsql之后,修改存储过程TempGetAppID,把 SET ...
- 一步步搭建自己的轻量级MVCphp框架-(二)一个国产轻量级框架Amysql源码分析(1)
这个框架是我一个做PHP的朋友“祥子”介绍给我的,Git地址https://coding.net/u/srar/p/AMP/git 下面从入口文件 总线程 ( index.php )开始进行分析 &l ...
- 每日一词【命令行CMD】
CURL 中文:命令行URL下载 英文解释:CommendLine Uniform Resource Locator 使用场景: 文件传输 curl是利用URL语法在命令行方式下工作的开源文件传输工具 ...
- Table of Contents - Tomcat
Manager 持久化 Session JNDI Resources JNDI 配置 JDBC DataSources DBCP 配置 Realm Configuration 设置 HTTP 基本认证 ...
- 【CSS3】---:before :after生成内容
在Web中插入内容,在CSS2.1时代依靠的是JavaScript来实现.但进入CSS3进代之后我们可以通过CSS3的伪类“:before”,“:after”和CSS3的伪元素“::before”.“ ...
- AndroidTestCase简单使用
1.根据需求创建TestCase类,实现测试用例.此类需继承AndroidTestCase类 public class TestCase extends AndroidTestCase { @Over ...
- 【原创】如何找到Oracle中哪条记录被锁
通常有这种情况,某个表或者准确的说是表的某条记录被锁(TX锁),在业务层面排查之余,一般都会想知道是哪条记录被锁,每次被锁的是否是同一条记录?还是每次都不同?通过记录可以找到这条记录可以在哪个模块.哪 ...
- JavaScript开发技巧
1.在编写js代码时,应尽量避免全局变量的使用.如果实在需要使用全局变量,则可以使用一个function来规避全局变量的使用. 2.数字解析 //1.丢弃小数部分,保留整数部分 alert( pars ...