php 后端socket服务长链接,多并发开发备忘
2013-04-23 14:21
495 查看
//保证子进程上限 if($this->_maxFork >0 && $this->_children > $this->_maxFork) { Yii::log("_children > ".$this->_maxFork,CLogger::LEVEL_WARNING,__METHOD__); $this->handler(SIGCHLD); // usleep(200); continue; } /** * 监控信号 * @param object socket $clientt * @return boolean */ public function handler($signo) { Yii::log("handler {$signo} ",CLogger::LEVEL_INFO, __METHOD__); switch(intval($signo)) { case SIGCLD: case SIGCHLD: Yii::log("SIGCHLD sub proccess ",CLogger::LEVEL_TRACE, __METHOD__); //正常退出 //declare = 1, that means one signal may be correspond multi-process die while( ($pid = pcntl_wait($status, WNOHANG|WUNTRACED)) > 0 ) { if (FALSE === pcntl_wifexited($status)) { Yii::log("sub proccess {$pid} exited unormally with code {$status}",CLogger::LEVEL_WARNING, __METHOD__); } else { Yii::log("sub proccess {$pid} exited normally",CLogger::LEVEL_INFO, __METHOD__); } $this->_children--; } break; case SIGINT: case SIGQUIT: case SIGHUP: //异常退出 $this->_cleanup(); exit(0); break; default: break; } }
【多进程方式注意点】
变量共享问题
因为是进程,可以理解成主进程的一个拷贝,执行是从调用 pcntl_fork() 后各主、子进程后自往后运行,避免子进程层层嵌套,一般子进程执行完后是用exit(0)来退出。 子进程如果执行过程中崩溃不会影响到主进程,也不能和主进程共享变量。
信号和select 冲突问题
pcntl_signal 注册信号后会和 stream_select 有冲突
PHP Error[2]: stream_select(): unable to select [4]: 被中断的系统调用 (max_fd=10)
目前没找到解决方法,未采用 pcntl_signal 进行监控。
进程回收
子进程通过exit退出后,会变成僵尸进程,需要通过 pcntl_wait 来进行回收。
centos 测试中发现最大的进程上限是3.2万,通过设置子进程总数,大于设定值再调用 pcntl_wait 来进行回收
socket读写注意
多进程情况下,会出现对同个socket句柄,有多个进程同时在读的问题。
解决方法是读操作在主进程里,读出所有数据后,抛给子进程进行执行。
文件操作注意
filesize 函数在多进程情况下会出现取不到或取到的文件大小一直不变问题
这里采用直接调用 linux下的系统函数解决。
$file_size = @filesize($logFile);
//解决并发情况下取不到文件大小问题
if(0 == $file_size ||$this->_prevFileSize == $file_size )
{
$file_size = @exec('/usr/bin/stat -c %s '. escapeshellarg($logFile));
clearstatcache();
}
压力测试后1000的并发可达到350每秒的请求。应该还可优化。
相关文章推荐
- 【备忘】使用php高可用webapp后端开发视频教程下载
- 基于swoole的Hprose for PHP 开发后端API服务 实践
- 一小时学会用Python Socket 开发可并发的FTP服务器!!
- Linux系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池
- websocket+php实现前后端实时通信
- MUi开发: mui.post学习心得、php做后端和跨域的解决办法
- PHP-学习大规模高并发Web系统架构及开发推荐书籍
- 开发攻略 | 微信小程序中使用后端云服务LeanCloud
- Mpass – PHP做Socket服务的解决方案
- [置顶] 实现APP支付QQ,微信,支付宝三方的后端服务------php实现微信APP支付
- 一小时学会用Python Socket 开发可并发的FTP服务器!! 推荐
- PHP微信h5棋牌开发socket
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
- 不错的介绍JS中Cookie的文章本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2009/0528/4789.php
- PHP微信开发(测试号)-建立链接
- [转]一小时学会用Python Socket 开发可并发的FTP服务器!!
- PHP开发Web服务
- java python php 经典开发流程 开发效率 运行效率&并发&可扩展
- 搭建LNAMP(Linux+Apache+Nginx+MySQL+PHP)前后端Web(PHP)开发环境
- 【iOS开发】后台定位&&socket长链接