消息队列中的数据同样受到大小的约束,具体约束范围可通过msg_stat_queue的msg_qbytes看到。这段代码唯一有点小改动的地方就在接受消息时,指定了MSG_IPC_NOWAIT,不然如果目标队列没有数据,默认会一直等待。 一般会用到共享内存或消息队列的情况,都会涉及

消息队列中的数据同样受到大小的约束,具体约束范围可通过msg_stat_queue的msg_qbytes看到。这段代码唯一有点小改动的地方就在接受消息时,指定了MSG_IPC_NOWAIT,不然如果目标队列没有数据,默认会一直等待。

一般会用到共享内存或消息队列的情况,都会涉及到多线程/进程,或跨语言的数据传递。如果是php脚本/进程间共享数据,那只要小心点操作就没什么

问题。如果要求跨语言,那很可能遇到千奇百怪的问题,呵呵,我还没试过,但在网上看到别人发的苦水贴,以后有机会一定实验一下。

在调试共享内存、信号量、消息队列时,可以配合Linux系统命令观察数据存储情况及信号量、消息队列资源分配情况,如ipcs, ipcrm命令。

利用PHP操作Linux消息队列完成进程间通信

当我们开发的系统需要使用多进程方式运行时,进程间通信便成了至关重要的环节。消息队列(message queue)是Linux系统进程间通信的一种方式。

关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/

关于Linux系统消息队列的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/

PHP的sysvmsg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。先来看一段示例代码_1:

$message_queue_key =ftok(__FILE__,'a');

$message_queue = msg_get_queue($message_queue_key, 0666);

var_dump($message_queue);

$message_queue_status = msg_stat_queue($message_queue);

print_r($message_queue_status);

//向消息队列中写

msg_send($message_queue, 1,"Hello,World!");

$message_queue_status = msg_stat_queue($message_queue);

print_r($message_queue_status);

//从消息队列中读

msg_receive($message_queue, 0,$message_type, 1024,$message, true, MSG_IPC_NOWAIT);

print_r($message."\r\n");

msg_remove_queue($message_queue);

?>这段代码的运行结果如下:

resource(4) of type (sysvmsg queue)

Array

(

[msg_perm.uid] => 1000

[msg_perm.gid] => 1000

[msg_perm.mode] => 438

[msg_stime] => 0

[msg_rtime] => 0

[msg_ctime] => 1279849495

[msg_qnum] => 0

[msg_qbytes] => 16384

[msg_lspid] => 0

[msg_lrpid] => 0

)

Array

(

[msg_perm.uid] => 1000

[msg_perm.gid] => 1000

[msg_perm.mode] => 438

[msg_stime] => 1279849495

[msg_rtime] => 0

[msg_ctime] => 1279849495

[msg_qnum] => 1

[msg_qbytes] => 16384

[msg_lspid] => 2184

[msg_lrpid] => 0

)

Hello,World!

可以看到已成功从消息队列中读取“Hello,World!”字符串

下面列举一下示例代码中的主要函数:

ftok ( string$pathname , string$proj )

手册上给出的解释是:Convert a pathnameand a project identifier to a System V IPC key。这个函数返回的键值唯一对应linux系统中一个消息队列。在获得消息队列的引用之前都需要调用这个函数。

msg_get_queue ( int$key [, int$perms ] )

msg_get_queue()

会根据传入的键值返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。函数

的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是同一个意思,因为在linux系统中一切皆是文件。

msg_send ( resource$queue , int$msgtype , mixed$message [, bool$serialize [, bool$blocking [, int &$errorcode ]]] )

顾名思义,该函数用来向消息队列中写数据。

msg_stat_queue ( resource$queue )

这个函数会返回消息队列的元数据。消息队列元数据中的信息很完整,包括了消息队列中待读取的消息数、最后读写队列的进程ID等。示例代码在第8行调用该函数返回的数组中队列中待读取的消息数msg_qnum值为0。

msg_receive ( resource$queue , int$desiredmsgtype , int &$msgtype , int$maxsize , mixed &$message [, bool$unserialize [, int$flags [, int &$errorcode ]]] )

msg_receive用于读取消息队列中的数据。

msg_remove_queue ( resource$queue )

msg_remove_queue用于销毁一个队列。示例代码_1只是展示了PHP操作消息队列函数的应用。下面的代码具体描述了进程间通信的场景

$message_queue_key =ftok(__FILE__,'a');

$message_queue = msg_get_queue($message_queue_key, 0666);

$pids =array();

for ($i = 0;$i < 5;$i++) {

//创建子进程

$pids[$i] = pcntl_fork();

if ($pids[$i]) {

echo "No.$i child process was created, the pid is $pids[$i]\r\n";

}elseif ($pids[$i] == 0) {

$pid = posix_getpid();

echo "process.$pid is writing now\r\n";

msg_send($message_queue, 1,"this is process.$pid's data\r\n");

posix_kill($pid, SIGTERM);

}

}

do {

msg_receive($message_queue, 0,$message_type, 1024,$message, true, MSG_IPC_NOWAIT);

echo $message;

//需要判断队列是否为空,如果为空就退出

//break;

}while(true)

?>运行结果为:

No.0 child process was created, the pid is 5249

No.1 child process was created, the pid is 5250

No.2 child process was created, the pid is 5251

No.3 child process was created, the pid is 5252

No.4 child process was created, the pid is 5253

process.5251 is writing now

this is process.5251's data

process.5253 is writing now

process.5252 is writing now

process.5250 is writing now

this is process.5253's data

this is process.5252's data

this is process.5250's data

process.5249 is writing now

this is process.5249's data

这段程序每次的运行结果都会不同,这正说明了多进程的异步性。从结果也能看出消息队列FIFO特性。

以上便是我研究的一点心得。接下来将会继续研究PHP利用信号、socket等进行进程间通信的方法。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 共享内存列队,php中对共享内存,消息队列的操作相关推荐

  1. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  2. uCos中的邮箱和消息队列

    文章目录 1. 背景 2. 直接通信与间接通信 3. 消息机制 4. 消息队列 5. ucos-ii中实现 5.1. 任务创建 5.2. 发送消息 5.3. 等待消息 1. 背景 前段时间老师上课讲到 ...

  3. PHP中利用redis实现消息队列处理高并发请求思路详解

    在电商活动中,常常会出现高并发的情况,例如很多人同时点击购买按钮,以至于购买人数超出了库存量,这是一种非常不理想的状况,因此,我们在PHP开发中就会引入消息队列来解决这种高并发的问题. 当用户点击按钮 ...

  4. PHP中使用ActiveMQ实现消息队列

    2019独角兽企业重金招聘Python工程师标准>>> PHP中使用ActiveMQ实现消息队列前面我们已经学了如何部署ActiveMQ, 我们知道通过ActiveMQ的一个管理后台 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列

    13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...

  6. python吃显卡还是内存不足_Pythorch中的GPU内存问题,GPUMemoryProblemsinPyTorch,显卡,爆炸,与,利用率,不足...

    如今研究人工智能,跑深度学习算法,显卡/GPU绝对是第一大门槛,所以不管您是1080Ti还是V100,如果不能发挥出GPU的最大能力,那它可能就是不是显卡而是块普通的砖头了吧. 显卡爆炸 显卡爆炸和内 ...

  7. java数组释放内存空间,Java中数组的内存分析

    正文 引言: 墨白在文末给大家准备了程序员的适用壁纸,需要的小伙伴自取,今天的内容是给大家聊聊Java中数组的内存分析和原理,很多朋友可能已经忘记了,毕竟这是非常基础的点了,这次算是给大家复习了吧! ...

  8. java内部类内存泄漏,Android中常见的内存泄漏和解决方案

    什么是内存泄漏? 简单点说,就是指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏. 为什么会产生内存泄漏,内存泄漏会导致什么问题? 相比C++需要手动去 ...

  9. java 结合redis队列_在 Java 中使用 redis 的消息队列服务

    前言 关于 redis 我们前面已经讨论过了缓存.分布式锁.分布式唯一标识.LBS服务的用法,这里我们来谈谈利用 redis 来实现一个消息服务. 典型的消息服务是一个生产者和消费者模式的服务.一般是 ...

最新文章

  1. module_param 在内核编程中的作用
  2. P4233-射命丸文的笔记【NTT,多项式求逆】
  3. UFT开发代码实例:将Excel中的数据保存为数组
  4. django 环境配置.
  5. matlab三次样条拟合,【MATLAB编程】三次样条
  6. 活动轮廓模型之Snake模型简介
  7. 用dcloud平台的H5+实现消息推送APP端通知栏接收的问题
  8. 成功解决http error 503.the service is unavailable错误
  9. Python Selenium破解滑块验证码最新版!
  10. Oracle数据库,创建表并给表、字段添加注释
  11. 前后台处理得到 前台图片 draw.io/ mxgraph
  12. 解构金蝶EAS 开发工具
  13. 活性DNA羟化酶 Tet1 活性测定
  14. android 自动挂断,android实现接通和挂断电话
  15. 1.0 如何使用cubemx并且移植RTX操作系统?(方法一)
  16. 用Python画一个中国地图
  17. 金蝶K/3和U8、易飞的对比分析
  18. 企业微信CRM功能详解:看看话术库如何帮助销售新人快速上手!
  19. 录音服务器修复中是什么原因,在母带中修复音频的 10 个常用方法
  20. MySQL5.7中英对照文档_用户变量 User-Defined Variables

热门文章

  1. nyoj_111_分数加减法_201311281341
  2. SQL Performance Analyzer SPA常用脚本汇总
  3. WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网...
  4. 2.1.2数据通信基础知识
  5. JVM学习笔记-03-类加载器及双亲委派机制
  6. 分层结构,协议,接口,服务
  7. linux内核等价多路径路由,Linux内核分析 - 网络[四]:路由表
  8. ivx中字体显示_iVX云服务费用优化 · 上篇
  9. python语言处理excel_Python语言操作excel
  10. 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...