我的程序设计如下图:
客户端通信数据格式为:
$msg = [
'from' => 'selfUsername' ,
'to' => 'toUsername' ,
'msg' => 'hello boy'
];
$msg = serialize($msg);
第一种实现与遇到的问题:
转发服务器创建的监听客户端连接的子进程接受到客户端发送的消息后,解析数据,找到监听对应客户端连接的子进程,将消息发送给子进程,然后那个子进程再将消息发送给对应的客户端链接。
这边有一个难题,就是如何给创建的子进程设立标识(使用进程ID来唯一标识一个子进程可以不)??进程间通信的方式该使用哪一种(消息队列、共享内存、socket...)??
第二种实现与遇到的问题
客户端连接的时候,将 资源描述符 和 创建的监听客户端连接的子进程ID 保存下来。客户端连接发来消息,对应监听的子进程接受到消息后,通过 进程ID 找到 对应的客户端连接资源描述符,直接向该客户端连接发送消息。
这边碰到的问题是,客户端链接的资源描述符 是 resource
类型的,无法在共享内存中维护一个保存有所有子进程ID 和 每个子进程ID对应监听的客户端连接资源描述符 的数组。因为 shm_put_var
中第二个参数写着保存的只能是能够被 serialize
的变量类型(resource
类型的无法序列化)!
请问,按照我上面提供的程序设计图,如何实现一对一聊天??
该问题有另外一种方法实现,参考我的另一种实现 私聊(PHP实现)。
不知道就这边的思路该如何实现??
隔江千里