- 55
- 0
本来使用 stream_socket_pair 是用来父子进程间通信的,实现多进程下,某个子进程消息通过父进程转发给其他子进程(类似于 qq),但是这碰到了一个问题:
$count = 4;
$childConn = [];
$parent = null;
for ($i = 0; $i < $count; ++$i)
{
$pair = stream_socket_pair(STREAM_PF_UNIX , STREAM_SOCK_STREAM , STREAM_IPRROTO_IP);
$pid = pcntl_fork();
if ($pid < 0) {
throw new Exception("创建子进程失败");
} else if ($pid > 0) {
fclose($pair[1]);
$child = $pair[0];
$childConn[$pid] = $child;
// 监听子进程消息
listenChild($child);
} else {
fclose($pair[0]);
$parent = $pair[1];
// 监听父进程消息
listenParent($parent);
}
}
以上目的就是为每个子进程创建与父进程的通信通道,然结果却发生了令人意外的效果!
比如下面一个通信过程:
父进程pid: 30246
子进程pid: 30247 30248 30249 30250,每个子进程中都监听客户端连接。
1. 客户端A 进入子进程 30247
2. 客户端B 进入子进程 30248
3. A 客户端发送消息,子进程 30247 接受到消息,要求转发给 30248 中的客户端 B
4. 子进程 30247 调用事先保存的 $parent(与父进程的通信连接),发送消息
... 意外产生了!!
你可能想当然的以为,他绝对是发送给父进程(30246)!
而实际上不是!结果可能是其他子进程!
到这儿,我就很郁闷了,stream_socket_pair 创建的成对套接字,怎么会发生这种现象??
我表示特别无语了 ....跪求大神解救
4
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
