网络IO 十四
进程间通信的方式(IPC intel-process communication) |
每个进程之间都是彼此互相隔离的,为了能是不同进程之间互相访问资源,才有了进程间的通信。 系统进行进程间通信的时候,可用的方式包括:管道,命名管道 / 消息队列 / 信号,信号量 / 共享内存 / 套接字 / 文件记录信息等形式。 |
消息队列 |
最简单的实现方式就是通过一个文件记录信息,然后另一个进程循环读取这个文件即可。 File_put_contents 与 file_get_contents
不过这里讲的是如何利用系统的消息队列 注意的是: Php操作系统linux内核的消息队列主要是使用sysvmsg扩展以及下面的函数 Ftok 创建key msg_get_queue 创建一个消息队列 msg_receive 读取信息 msg_remove_queue msg_send 向队列发送数据 |
msg_receive |
在没有接收到信息的时候,会是一个阻塞的状态 |
msg_send( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )
|
第1个参数 : resource $queue 发送数据的队列。 第2个参数 : int $desiredmsgtype 读取的消息类型。这个参数为 0 的时候,你可以读取 msg_send 以任意 消息类型 发送的消息。 如果此参数和你发送的某个消息类型相同,比如你有 2个消息,一个是通过 1类型发送的,一个是通过2 类型发送的。你用 0 可以接收这两种消息 ,而你用 1 只能接收到 以1类型发送的消息。 第3个参数 : int\&$msgtype 指定类型 数据类型是什么,它发送时的消息类型会存储在该参数中。 第4个参数 : int $maxsize 你以多大的字节去读取消息,如果这个值小于你要读取的内容的长度,你会读取失败。 第5个参数 : mixed\&$message 发送数据。 |
原生php与swoole的task的交互 |
向task投递任务 $server->on( 'task' , function( $server , $task_id , $form_id , $data){ echo "xxxx"; }) |
在worker中实现task进程 |
可以通过 task_worker_num 开启 设置task进程个数
记录taskpid pcntl_fork创建task进程的函数 处理信息 死循环msg_receive task进程的投递 |
task的作用 vs 消息中间件 |
Task:帮助我们处理一些耗时任务的业务逻辑,完成之后会通知给相应的进程。
消息中间件:可能还会考虑到消息的优先级,延迟任务,存储,应答等; |
|
|