PHP下操作Linux消息队列完成进程间通信的方法
前端之家收集整理的这篇文章主要介绍了
PHP下操作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:
<div class="codetitle"><a style="CURSOR: pointer" data="54981" class="copybut" id="copybut54981" onclick="doCopy('code54981')"> 代码如下:
<div class="codebody" id="code54981">
<?
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,$message_type,1024,$message,true,MSG_IPC_NOWAIT);
print_r($message."\r\n");
msg_remove_queue($message_queue);
?>
这段
代码的运行结果如下:
<div class="codetitle">
<a style="CURSOR: pointer" data="46695" class="copybut" id="copybut46695" onclick="doCopy('code46695')"> 代码如下: <div class="codebody" id="code46695">
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!”字符串
下面列举一下示例
代码中的主要
函数:
<div class="codetitle">
<a style="CURSOR: pointer" data="24669" class="copybut" id="copybut24669" onclick="doCopy('code24669')"> 代码如下: <div class="codebody" id="code24669">
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用于销毁一个队列。