PHP下操作Linux消息队列完成进程间通信的方法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

来源:http://www.jb51.net/article/24353.htm

关于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: 

复制代码代码如下:


?php 
$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 pathname and 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操作消息队列函数的应用。下面的代码具体描述了进程间通信的场景 

复制代码代码如下:


?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等进行进程间通信的方法。

转载于:https://my.oschina.net/botkenni/blog/753335

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 7 发布的最后一个预览版Preview 7, 下个月发布RC

微软在2022年8月9日 发布了.NET 7 Preview 7[1]&#xff0c;这是它在11月10日 RTM 之前进入发布候选阶段之前的最后预览版。预览版 7 已在 Visual Studio 17.4 预览版 1 中进行了测试&#xff0c;该预览版也于也与 VS 2022 v17.3 版本一起发布。对于预览版7&#xff0c;开发团队…

2022年全球职业教育行业发展报告

职业教育丨研究报告 核心摘要&#xff1a; 职业教育是职业学校教育与职业培训组成的有机整体&#xff0c;行业参与者除教育培训机构与受训学生外&#xff0c;还涉及企业雇主、行业协会、政府等多方&#xff0c;各群体共同构成密不可分的产业生态。 宏观而言&#xff0c;职业…

实战Cacti网络监控(1)——基础安装配置

实验环境&#xff1a; 物理主机 redhat7.0 内核版本 3.10.0-123.el7.x86_64 虚拟机 redhat6.5 内核版本 2.6.32-431.el6.x86_64 server10.example.com 172.25.254.10 所需软件包&#xff1a; cacti-0.8.8h.tar.g…

《ASP.NET Core 6框架揭秘》实例演示[13]:日志的基本编程模式

《ASP.NET Core 6框架揭秘实例演示[11]&#xff1a;诊断跟踪的几种基本编程方式》介绍了四种常用的诊断日志框架。其实除了微软提供的这些日志框架&#xff0c;还有很多第三方日志框架可供我们选择&#xff0c;比如Log4Net、NLog和Serilog 等。虽然这些框架大都采用类似的设计&…

Caffine Cache 及在SpringBoot中的使用

这一篇我们将要谈到一个新的本地缓存框架&#xff1a;Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache&#xff0c;借着他的思想优化了算法发展而来。 本篇博文主要介绍Caffine Cache 的使用方式&#xff0c;以及Caffine Cache在SpringBoot中的使用。 1. Caffine Cache 在…

C#深入.NET平台的软件系统分层开发

今天我们来讲讲分层开发&#xff0c;你从标题能不能简单的认识一下什么是分层呢&#xff1f; 不懂也没关系&#xff0c;接下来我来给你讲讲。 第一章 软件系统的分层开发 &#xff08;1&#xff09;其实分层模式可以这样定义&#xff1a;将解决方案中功能不同的模块分到不同的项…

productFlavors设置signingConfig不管用的问题

2019独角兽企业重金招聘Python工程师标准>>> 在buildTypes release里面添加&#xff1a; productFlavors.dev_.signingConfig signingConfigs.devSign productFlavors.alphaTest_.signingConfig signingConfigs.devSign productFlavors.betaTest_.signingConfig si…

Linux学习之服务器搭建——DHCP服务器

通过前面基础网络配置已经将两台虚拟机连接起来了&#xff0c;在windows 下是将它和Centos设为统一网段&#xff0c;在DHCP里同样不变&#xff0c;改变的是将windows 所配置的静态IP全部换成“自动获取DHCP”而在接下来的操作&#xff0c;就是让我的windows 自动获取来自Linux …

WPF 动态切换黑|白皮肤

WPF 动态切换黑|白皮肤WPF 使用 WPFDevelopers.Minimal 如何动态切换黑|白皮肤作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40&#xff1b;Visual Studio 2022;项目使用 MIT 开源…

中小企业虚拟化解决方案-VMware vSphere 6.5-日常管理入口v0.0.1

中小企业虚拟化解决方案-VMware vSphere 6.5日常管理入口v0.0.1本文目的&#xff1a;针对中小企业虚拟化的平台管理&#xff0c;涉及到很多管理入口&#xff0c;普通管理员未必知道从哪里管理?本文将从最底层到最高层进行简单的介绍&#xff0c;最终让普通管理员快速了解管理入…

Svn服务器的搭建与配置

本文由ilanniweb提供友情赞助&#xff0c;首发于烂泥行天下想要获得更多的文章&#xff0c;可以关注我的微信ilanniweb要把svn代码同步到git服务器上&#xff0c;本来是想通过subgit直接同步进行就行了。但是自已以前没有搭建过svn服务器&#xff0c;所以有了这篇文章。我们就来…

JAVA Future类详解

1. Future的应用场景 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;在之前的多线程的三种实现中&#xff0c;不管是继承thread类还是实现runnable接口&#xff0c;都无法保证获取到之前的执行结果。通过实现Callback接口&#xff0c;并用Future可以来接收多线…

最新 .NET 社区工具包, 推出MVVM 源代码生成器!

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;10分钟)我们很高兴地宣布正式推出新的 .NET 社区工具包&#xff0c;现在已经在NuGet上发布了8.0.0版本&#xff01;这是一个重要版本&#xff0c;包括大量新功能、改进、优化、错误修复&#xff0c;许多反映了全新项目…

Java并发编程:Executor、Executors、ExecutorService

Executors 在Java 5之后&#xff0c;并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的&#xff0c;其内部使用了线程池机制&#xff0c;它在java.util.cocurrent 包下&#xff0c;通过该框架来控制线程的启动、执行和关闭&#xff0c;可以简化…

IOTCS+Ekuiper搭建物联网边缘计算平台

背景介绍IOTCS 是专为物联网平台而设计的工业智能网关。自从 2020 年 10 月以来&#xff0c;我们从需求调研&#xff0c;设计&#xff0c;定型&#xff0c;研发&#xff0c;测试经过漫长的沉淀与孵化&#xff0c;最终顺利实现工业智能网关最初的设想。我们凭借创新设计理念、快…

JMX 使用指南一 Java Management Extensions

1. 什么是 JMX JMX&#xff0c;全称 Java Management Extensions&#xff0c;是在 J2SE 5.0 版本中引入的一个功能。提供了一种在运行时动态管理资源的框架&#xff0c;主要用于企业应用程序中实现可配置或动态获取应用程序的状态。JMX 提供了一种简单、标准的监控和管理资源的…

多种方法实现自适应布局

最近切了几个手机端的网页&#xff0c;第一次切的是美团的首页&#xff0c;为了自适应不同的手机分辨率&#xff0c;需要用到自适应布局&#xff0c;切图的时候是用的第一中方法&#xff0c;用到了定位&#xff0c;后来查找了一些其他方法&#xff0c;现在就介绍几种自适应布局…

hivesql优化的深入解析

转载&#xff1a;https://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job&#xff0c;一个Map Reduce Job又有Map&#xff0c;Reduce&#xff0c;Spill&#xff0c;Shuffle&#xff0c;Sort等多个阶段&#xff0c;所以针对Hive查询的优化可以大致…

如何用一行 CSS 实现 10 种现代布局

现代 CSS 布局使开发人员只需按几下键就可以编写十分有意义且强大的样式规则。上面的讨论和接下来的帖文研究了 10 种强大的 CSS 布局&#xff0c;它们实现了一些非凡的工作。 01. 超级居中&#xff1a;place-items: center 对于第一个“单行”布局&#xff0c;让我们解决所有 …

在.NET 6.0中使用不同的托管模型

本章是《定制ASP NET 6.0框架系列文章》的第六篇。在本章中&#xff0c;我们将讨论如何在ASP NET 6.0中自定义托管宿主。比如&#xff0c;托管选项和不同类型的托管&#xff0c;并了解一下IIS上的托管。限于篇幅&#xff0c;本章只是一个抛砖迎玉。本章涵盖主题包括&#xff1a…