php H5问题回复系统,【php】php 实现一对一聊天的遇到的问题该如何解决??

我的程序设计如下图:

3d1992cdb43c5ba987b493ab792eb000.png

客户端通信数据格式为:

$msg = [

'from' => 'selfUsername' ,

'to' => 'toUsername' ,

'msg' => 'hello boy'

];

$msg = serialize($msg);

第一种实现与遇到的问题:

转发服务器创建的监听客户端连接的子进程接受到客户端发送的消息后,解析数据,找到监听对应客户端连接的子进程,将消息发送给子进程,然后那个子进程再将消息发送给对应的客户端链接。

这边有一个难题,就是如何给创建的子进程设立标识(使用进程ID来唯一标识一个子进程可以不)??进程间通信的方式该使用哪一种(消息队列、共享内存、socket…)??

第二种实现与遇到的问题

客户端连接的时候,将 资源描述符 和 创建的监听客户端连接的子进程ID 保存下来。客户端连接发来消息,对应监听的子进程接受到消息后,通过 进程ID 找到 对应的客户端连接资源描述符,直接向该客户端连接发送消息。

这边碰到的问题是,客户端链接的资源描述符 是 resource 类型的,无法在共享内存中维护一个保存有所有子进程ID 和 每个子进程ID对应监听的客户端连接资源描述符 的数组。因为 shm_put_var 中第二个参数写着保存的只能是能够被 serialize 的变量类型(resource 类型的无法序列化)!

请问,按照我上面提供的程序设计图,如何实现一对一聊天??

该问题有另外一种方法实现,参考我的另一种实现 私聊(PHP实现)。

不知道就这边的思路该如何实现??

回答

进程通讯可以使用上面链接中所说的函数,它会创建2个socket resource, 这时候,你fork进程,父进程使用第一个socket,子进程使用第二个socket。就可以使用socket进行进程通讯了。

这边有一个难题,就是如何给创建的子进程设立标识

这很简单,兄弟。当你fork进程后,就能得到子进程的pid。然后,你将其存到一个关联数字。结构类似下面这样子

[

"" => [

"pid" => ,

"child socket" => ,

],

];

当你的master或者说child process,我不知道你的架构。收到一条消息时。

你就可以将消息通过子进程的pid或者说,子进程的socket,通知到对应的子进程了。然后它去发送数据就好了。

感谢您致电百思买,请问我是否准确的解答了你所有的问题呢?

我是来推荐 swoole 的。怎么可以不用这个,或者使用 easyswoole。

官网有 socket 的 demo。

8e42fa2748f7b0d9561755984de0047f.png

b493d964d0fc40a9120eee55267c4ad0.png

如果你是使用compoesr 为依赖的话,https://github.com/nahid/talk… 这个包你可以考虑一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值