素材牛VIP会员
php 实现一对一聊天的遇到的问题该如何解决??
 h***o  分类:PHP代码  人气:886  回帖:3  发布于6年前 收藏

我的程序设计如下图:

客户端通信数据格式为:

$msg = [
    'from' => 'selfUsername' , 
    'to'   => 'toUsername' , 
    'msg'  => 'hello boy'
];

$msg = serialize($msg);

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

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

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

第二种实现与遇到的问题

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

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

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


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

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

 标签:多进程php

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv1 新人
十***刻 产品经理 6年前#1

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

Lv3 码奴
sc***31 Linux系统工程师 6年前#2

http://php.net/manual/en/func...
留个链接,稍后来答

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

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

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

"<user_id>" => [
    "pid" => <child pid>,
    "child socket" => <socket resource>,
],

];

当你的master或者说child process,我不知道你的架构。收到一条消息时。
你就可以将消息通过子进程的pid或者说,子进程的socket,通知到对应的子进程了。然后它去发送数据就好了。

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

Lv6 码匠
ed***on 移动开发工程师 6年前#3

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取