网络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:帮助我们处理一些耗时任务的业务逻辑,完成之后会通知给相应的进程。

 

消息中间件:可能还会考虑到消息的优先级,延迟任务,存储,应答等;

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值