// 创建套接字
socket_create();
// 绑定
socket_bind();
// 监听
socket_listen(); // 主体, 死循环
while(true){
// select模型, 取出可读套接字列表
socket_select(); foreach(sockets) {
// 如果是监听连接请求端口的套接字
if(is listensocket) {
// 接受请求
socket_accept();
}
else {
// 读取封包
socket­_recv();
// 处理用户动作 {问题就在这}
process();
}
}
}
php socket 模型及效率问题
呼呼安

呼呼安
// 创建套接字
socket_create();
// 绑定
socket_bind();
// 监听
socket_listen(); // 主体, 死循环
while(true){
// select模型, 取出可读套接字列表
socket_select(); foreach(sockets) {
// 如果是监听连接请求端口的套接字
if(is listensocket) {
// 接受请求
socket_accept();
}
else {
// 读取封包
socket­_recv();
// 处理用户动作 {问题就在这}
process();
}
}
} 关于php做服务端的效率, 我想这里是个问题吧。
在每处理一个用户的动作的时候, 整个循环被阻塞在这里, 导致其他的连接不能接受, 其他用户的动作请求不能被处理。 直到process()函数返回才能处理下一个动作。
处理一个用户动作的时候, 可能还要涉及到数据库访问等, 可能比较耗时。
不知道有没有哪位大仙有解决办法呢。 我想的是, 如果能做一个动作队列, 这里的循环只负责接收数据, 然后把数据包保存在一个队列里, 就去接收下一个用户的封包。
另一个线程(不知道PHP怎么实现线程, 或是能不能实现)从队列中抽取每一个用户的动作请求来处理它。。 或着process()函数能不能做成非阻塞的, 让它可以立即返回。。 小弟初学,如有可笑之处,请见谅! 评论 () • 分享 • 链接 • -- 
4个答案 票 数
冯义军

冯义军14.02K
最佳答案
这个问题我也遇到过到,比如打开两个终端,telnet socket服务端,如果其中一个不返回,另一个终端总是等待。最后使用fork子进程方式解决,大概代码如下,你可以参考下: 死循环部分 do {
$msgsock = socket_accept($socket);
$pid = pcntl_fork();
if($pid == -) {
// fork error ;
}else if($pid) {
socket_close($msgsock);
}else {
$buf = socket_read($msgsock,,PHP_NORMAL_READ);
$ret = func($buf); //调用函数处理接收到的内容
socket_write($msgsock,$ret,strlen($ret));
socket_close($msgsock);
//posix_kill(posix_getpid(),0);
exit();
}
}while(true) 评论 () • 链接 • -- @冯义军 你好, 我在本地测试的时候, 可以用cmd运行php, 或是在网页上访问一下, 然后关闭网页就行了, php会一直执行, 然后端口就可以一直访问。。
但是我放服务器上(linux), 怎么让它一直执行啊, 我用网页访问它的时候可以连接, 如果关了网页, 就会关闭。 – 呼呼安 -- @呼呼安 在 socket服务端程序中 开头增加 ignore_user_abort(); set_time_limit(); 这两句,就可以运行一次关浏览器了。
另外还可以在命令行运行,如 /usr/local/php/bin xxx.php & – 冯义军 -- @冯义军 set_time_limit()这个我加了, ignore_user_abort();这个没加就不行吗 – 呼呼安 -- @呼呼安 ignore_user_abort();主要是设置与客户机断开是否会终止脚本的行,set_time_limit() 主要是指定程序运行的最大时间。 – 冯义军 --
显示更多隐藏的评论
呼呼安

呼呼安70
我貌似自己想到了一个办法。。 process()的地方修改一下, 直接写到数据库里(或着谁有更快的方法请告知)。
就是我所说的“动作队列”。 再写一个类似的php文件, 也是死循环。
while(true) {
// 从数据库里取出一条待处理动作
// 处理它
// 从数据库里删除该动作
} 甚至可以多运行几次这个文件, 就是不知道想停的时候怎么停 >_< 评论 () • 链接 • --
龙虾猫

龙虾猫1
风大做了一个基于pcntl的多进程Socket服务框架,可以参考使用下
http://code.google.com/p/mpass/

php socket 模型及效率问题的更多相关文章

  1. .NET平台下几种SOCKET模型的简要性能供参考

    转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...

  2. Socket模型(二):完成端口(IOCP)

    为什么要采用Socket模型,而不直接使用Socket? 原因源于recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他链接不能继续.这样我们又 ...

  3. 手把手教你玩转SOCKET模型之重叠I/O篇(下)

    四.     实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...

  4. 转:变手把手教你玩转SOCKET模型之重叠I/O篇

    手把手教你玩转SOCKET模型之重叠I/O篇 “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙 ...

  5. socket模型

    Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议). 一台电脑(IP)的一个应用程序(端口) 和 另一台 ...

  6. PJSIP Socket 模型

    前些日子为解决项目中问题调试到PJSIP Socket收发数据部分 ,好记性不如烂笔头,记录下 PJSIP 使用的Socket 模型 ,以备后用. 不同平台下PJSIP采用不同的 Socket模型,W ...

  7. Socket模型详解(转)

    两种I/O模式 一.选择模型 二.异步选择 三.事件选择 四.重叠I/O模型 五.完成端口模型 五种I/O模型的比较 两种I/O模式 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待 ...

  8. 手把手教你玩转SOCKET模型之重叠I/O篇(上)

    “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯付 ...

  9. socket模型处理多个客户端

    最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题. 在服务器程序的设计中,一个服务器不可能只相应 ...

随机推荐

  1. 调用wsdl的接口-用axis

    // 创建一个服务(service)调用(call) org.apache.axis.client.Service service = new org.apache.axis.client.Servi ...

  2. Kubernetes应用迁移问题定位

    这个帖子记录所有的应用迁移中遇到的问题. 关于镜像无法启动后无法定位问题 在原有的Dockerfile中修改,加入 RUN echo "aaa" > /etc/a.log C ...

  3. rsa实现js前台加密java后台解密

    前段时间写了一个rsa前台加密到后台用java解密,下面共享下实现思路: 准备工作:第三方包是必须的 bcprov-jdk15on-148.jar commons-codec-1.7.jar comm ...

  4. 心路历程——毕设程序mr跑不通的问题

    这个bug改了实在是太多天了,前前后后折腾了太久,最后多谢@CC学长的帮助,找到了问题,才终于跑通了!!!这里记录一下这个bug我前后改的过程,引以为戒! 毕设中需要进行mapreduce进行数据清洗 ...

  5. HttpServletRequest和HttpServletResponse详解

    请求与响应相关的类和接口非常多,下表是主要的与请求和接口相关的类以及接口. 主要的与请求和接口相关的类及接口 方    法 说    明 ServletInputStream Servlet的输入流 ...

  6. eclipse缺省的Server没有weblogic

    转自:http://www.javakfz.com/index.php/08/06/471.html eclipse缺省的Server没有weblogic,因此要下载个weblogic的插件.这个过程 ...

  7. chrome浏览器 提示Adobe Flash Player未安装的解决方法

    最近遇到了个flash player设置的一个问题,记录一下,可能不同浏览器版本和设置不一样 浏览器版本:版本 61.0.3163.100(正式版本) (64 位) 打开需要flash player的 ...

  8. Odoo环境下Ubuntu服务器性能优化--参数调整

    公司在使用Odoo进行内部信息化管理,随着业务增长,服务器性能问题变成了瓶颈,为了解决这些问题,最近的工作重点将移到性能调整上来,同时也会在此记录整个处理过程,以便日后回顾. 1.根据相关资料建议,在 ...

  9. Ubuntu 11.04 安装后要做的20件事情

    转自:http://www.cnbeta.com/articles/141137.htm #1 不喜欢Unity? 切换到Ubuntu gnome 经典桌面 注销unity桌面环境,然后选择登录环境为 ...

  10. ionicframework(二)

    Start building with Ionic! Follow these quick steps and start building high quality mobile apps in m ...