php 共享内存列队,php中对共享内存,消息队列的操作

消息队列中的数据同样受到大小的约束,具体约束范围可通过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中文网,转载请注明出处,感谢您的尊重!

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

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

相关文章

python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

浅谈python中拼接路径os.path.join斜杠的问题调试程序的过程中&#xff0c;发现通过os.path.join拼接的路径出现了反斜杠directory1/opt/apps/upgradePackagedirectory2icp_v1.8.0directory3os.path.join(directory1,directory2)print(directory3 : %s %directory3)执行结果dir…

matlab约当消去法,Gauss消去法解线性方程组(Matlab)

clear;clc;% Gauss消去法解线性方程组A[3 -5 6 4 -2 -3 8;1 1 -9 15 1 -9 2;2 -1 7 5 -1 6 11;-1 1 3 2 7 -1 -2;4 3 1 -7 2 1 1;2 9 -8 11 -1 -4 -1;7 2 -1 2 7 -1 9];%系数矩阵b[11 2 29 9 5 8 25];%n维向量yinv(A)*b %matlab的计算结果nlength(b);%方程个数nxzeros(n,1);%…

动感灯箱制作流程培训_广告立体灯箱的特点有哪些?

随着广告业的发展&#xff0c;灯箱广告行业也在突飞猛进。在灯箱广告屏的设计与制作中&#xff0c;为了追求真实感和艺术性&#xff0c;采用彩印或摄影喷绘;也有人用特种纸、塑料板(膜)、灯箱布等进行丝网印刷制作灯箱图片&#xff0c;并根据成本和耐候性要求选择制作方法和灯箱…

MATLAB仿真TSC在哪里找,-bash:tsc:找不到命令

我正在使用MAC并尝试安装TypeScript . 我使用安装打字稿sudo npm install -g typescript以下是结果Password:/Users//node/bin/tsc -> /Users//node/lib/node_modules/typescript/bin/tsc/Users//node/bin/tsserver -> /Users//node/lib/node_modules/typescript/bin/tss…

supervisor 重启_supervisor_twiddler的使用

点击上方蓝字关注【 北邮郭大宝 】Supervisor可以很好的实现Python的进程管理&#xff0c;但是新增进程时需要配置文件&#xff0c;对于需要动态创建进程的场景不是很友好&#xff0c;supervisor_twiddler插件可以帮助实现上述功能。本文就supervisor_twiddler的使用做简单的de…

matlab的词云,Word Cloud (词云) - JavaScript

在上一篇中已经分享了用 Python 创建词云了。接下来继续总结其他创建词云的方法。&带道术用量确示常构端析以要效开的用&#xff0c;近不gt;> Create Word Cloud via JavaScrip要圈器是天的年编功小还久概据含直这请框结业未商屏页屏随会维气大机域页效实一应控高标tJav…

python数据分析的步骤排序_Python数据分析

一.数据分析步骤1.提出问题2.理解数据3.数据清洗4.构建模型5.数据可视化二.朝阳医院2018年销售数据数据导入在文件路径前加r(转义符)文件可能有多个sheet&#xff0c;所以用sheet_name重命名参数dtypestr同意先按照字符串读入&#xff0c;之后再转换salesDf.head()&#xff0c;…

archlinux php mysql,arch linux上安装 httpd+php+mysql+ openssl(转)

arch linux上安装 httpdphpmysql openssl(转)[more]在arch linux安装则是非常的容易&#xff0c;只要执行&#xff1a;# pacman -Sy apache php mysql openssl根据提示选择输入Y即可安装&#xff01;1.修改apache配置文件默认的情况&#xff0c;apache是不支持PHP的&#xff0c…

ai人工智能python开发_Python才是人工智能AI的首选编程语言,你值得拥有……

在所有编程语言里&#xff0c;Python并不算萌新&#xff0c;从1991年发布第一个版本&#xff0c;至今已经快30年了。最近几年&#xff0c;随着人工智能概念的火爆&#xff0c;Python迅速升温&#xff0c;成为众多AI从业者的首选语言。根据数据平台 Kaggle发布的2017年机器学习及…

php bind_param,php – 在mysqli bind_param中绑定动态变量

当我尝试下面的代码时,它会给我一个警告mysqli_stmt::bind_param(): Number of elements in type definition string doesnt match number of bind variables$stmt $mysqli->prepare(SELECT * FROM users WHERE lname ? AND fname ?);$type "ss";$param ar…

unique函数_unique函数使用场景(一)

unique函数使用场景(一)前情提示&#xff1a;Microsoft 365(就是原来的office 365)已经推出有一段时间了&#xff0c;去年年审就在项目上使用365更新的一系列动态函数来提高审计效率(大胆一点&#xff0c;就是更好的偷懒)。讲解动态函数的文章不多&#xff0c;且365普及度低&am…

php属性未定义,PHP-警告-未定义的属性:stdClass-修复?

我在错误日志中收到此警告&#xff0c;并想知道如何在代码中更正此问题。警告&#xff1a;PHP注意&#xff1a;未定义属性&#xff1a;stdClass :: $ records在440行的script.php中一些代码&#xff1a;// Parse object to get account ids// The response doesnt have the rec…

python做数据和大数据区别_不懂Python,不懂大数据的人,和咸鱼有什么区别?

原标题&#xff1a;不懂Python&#xff0c;不懂大数据的人&#xff0c;和咸鱼有什么区别&#xff1f;在这个处处充斥着大数据影响的时代之下&#xff0c;不懂Python&#xff0c;不懂大数据&#xff0c;你就可能轻易地错过身边的黄金。我们生活在数据密布的环境中&#xff0c;就…

c++gdal如何在大图像中截取小图像并获取其图像信息_【图像处理】OpenCV系列十 --- 边缘检测之Canny算子...

上一篇我们学习了图像处理形态学相关知识点&#xff0c;相信大家学习之后已经对形态学有了足够的理解了&#xff0c;那么接下来&#xff0c;我们一起来学习一下图像处理中的边缘检测吧&#xff01;我们将会重点学习边缘检测各种算子和滤波器 --- Canny算子,Sobel算子,Laplace算…

php登录信息首页显示,首页登录后怎么在首页显示用户名以及隐藏登录框?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼index.php&#xff1a;登录页面用户名&#xff1a;密码&#xff1a;没有账号&#xff1f;立即注册——————————————————————————doaction.php&#xff1a;header("Content-type:text/html;charsetutf…

python矩阵相乘例题_百道Python入门级练习题(新手友好)第一回合——矩阵乘法...

题目描述【问题描述】编写程序&#xff0c;完成3*&#xff14;矩阵和4*&#xff13;整数矩阵的乘法&#xff0c;输出结果矩阵。【输入形式】一行&#xff0c;供24个整数。以先行后列顺序输入第一个矩阵&#xff0c;而后输入第二个矩阵。【输出形式】先行后列顺序输出结果矩阵&a…

笔记本屏幕30hz_你真的了解笔记本电池和电源适配器吗?

很多笔记本硬件配置相似&#xff0c;但续航或性能却相差一大截。实际上&#xff0c;笔记本的续航能力在很大程度上取决于电池&#xff1b;而实际性能&#xff0c;则还会受到电源适配器功率的影响。想认识这两个硬件&#xff0c;就需要从它们的基本参数谈起。笔记本电池笔记本的…

java 俄文,俄文字体在word里面是什么

在Word里输入俄语字母,一打字字体就变成宋体了,俄语字母间间距...我不知道你这个俄语输入法补丁的字库用的是什么&#xff0c;如果是汉字库里好像就没办法调了&#xff0c;试一下把字体改成西文的Times New Roman、Arial等字体看有没有变化&#xff0c;如果没有&#xff0c;那就…

excel公式不自动计算_【纯干货】值得收藏的Excel日期计算公式!

点击上面“零壹快学”关注我们小伙伴们好&#xff0c;今天零壹学长给大家整理了一些常用的日期计算公式&#xff0c;赶紧往下看吧&#xff01;01根据身份证号计算出生年月--TEXT(MID(A2,7,8),"0-00-00")02根据身份证号提取性别IF(MOD(MID(A2,15,3),2),"男"…

php xml 添加节点 出问题,PHP往XML中添加节点的方法

本文实例讲述了PHP往XML中添加节点的方法。分享给大家供大家参考。具体方法如下&#xff1a;1. contacts.xml代码复制代码 代码如下:JJJManagerNational1971-12-222. php代码复制代码 代码如下:$tel_node null;$doc xmldocfile (contacts.xml);$contact_node $doc->root …