PHP-php socket 模型及效率问题

WP主题讨论 WP主题讨论 主题:1013 回复:2239

PHP-php socket 模型及效率问题

瑾兮 发布于 2016-10-12 字数 539 浏览 1157 回复 4
// 创建套接字
socket_create();
// 绑定
socket_bind();
// 监听
socket_listen();

// 主体, 死循环
while(true){
// select模型, 取出可读套接字列表
socket_select();

foreach(sockets) {
// 如果是监听连接请求端口的套接字
if(is listensocket) {
// 接受请求
socket_accept();
}
else {
// 读取封包
socket­_recv();
// 处理用户动作 {问题就在这}
process();
}
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

浮生未歇 2017-09-18 4 楼

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

甜柠檬 2017-08-13 3 楼

这个问题我也遇到过到,比如打开两个终端,telnet socket服务端,如果其中一个不返回,另一个终端总是等待。最后使用fork子进程方式解决,大概代码如下,你可以参考下:

死循环部分

do {
$msgsock = socket_accept($socket);
$pid = pcntl_fork();
if($pid == -1) {
// fork error ;
}else if($pid) {
socket_close($msgsock);
}else {
$buf = socket_read($msgsock,1024,PHP_NORMAL_READ);
$ret = func($buf); //调用函数处理接收到的内容
socket_write($msgsock,$ret,strlen($ret));
socket_close($msgsock);
//posix_kill(posix_getpid(),0);
exit();
}
}while(true)

泛泛之交 2017-04-24 2 楼

我貌似自己想到了一个办法。。

process()的地方修改一下, 直接写到数据库里(或着谁有更快的方法请告知)。
就是我所说的“动作队列”。

再写一个类似的php文件, 也是死循环。
while(true) {
// 从数据库里取出一条待处理动作
// 处理它
// 从数据库里删除该动作
}

甚至可以多运行几次这个文件, 就是不知道想停的时候怎么停 >_<

想挽留 2016-10-22 1 楼

需要fork子进程来解决效率问题。但是还可以进一步优化,为了更高性能,应该预先fork一些子进程出来,每个子进程while循环去accept(或者Epoll)等待客户端连接并处理请求,请求完毕子进程其实也不用马上退出,还可以继续等用户连接。

为了完善更稳定还要守护进程化、增加启动停止脚本、主进程监控子进程退出事件、文件更新监控、进程间通讯等等。

总之这些都可以用PHP来做,并且运行的也很好,我压测普通四核pc helloworld可以达到3W/S的请求量。

代码在 workerman