天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP下操作Linux消息隊列完成進程間通信的方法

關(guān)于Linux系統(tǒng)進程通信的概念及實現(xiàn)可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/
  關(guān)于Linux系統(tǒng)消息隊列的概念及實現(xiàn)可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
  php的sysvmsg模塊是對Linux系統(tǒng)支持的System V IPC中的System V消息隊列函數(shù)族的封裝。我們需要利用sysvmsg模塊提供的函數(shù)來進進程間通信。先來看一段示例代碼_1:
復(fù)制代碼 代碼如下:
<?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);
?>

這段代碼的運行結(jié)果如下:
復(fù)制代碼 代碼如下:
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!”字符串
  下面列舉一下示例代碼中的主要函數(shù):
復(fù)制代碼 代碼如下:
ftok ( string $pathname , string $proj )
手冊上給出的解釋是:Convert a pathname and a project identifier to a System V IPC key。這個函數(shù)返回的鍵值唯一對應(yīng)linux系統(tǒng)中一個消息隊列。在獲得消息隊列的引用之前都需要調(diào)用這個函數(shù)。
msg_get_queue ( int $key [, int $perms ] )
msg_get_queue()會根據(jù)傳入的鍵值返回一個消息隊列的引用。如果linux系統(tǒng)中沒有消息隊列與鍵值對應(yīng),msg_get_queue()將會創(chuàng)建一個新的消息隊列。函數(shù)的第二個參數(shù)需要傳入一個int值,作為新創(chuàng)建的消息隊列的權(quán)限值,默認(rèn)為0666。這個權(quán)限值與linux命令chmod中使用的數(shù)值是同一個意思,因為在linux系統(tǒng)中一切皆是文件。
msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize [, bool $blocking [, int &$errorcode ]]] )
顧名思義,該函數(shù)用來向消息隊列中寫數(shù)據(jù)。
msg_stat_queue ( resource $queue )
這個函數(shù)會返回消息隊列的元數(shù)據(jù)。消息隊列元數(shù)據(jù)中的信息很完整,包括了消息隊列中待讀取的消息數(shù)、最后讀寫隊列的進程ID等。示例代碼在第8行調(diào)用該函數(shù)返回的數(shù)組中隊列中待讀取的消息數(shù)msg_qnum值為0。
msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize [, int $flags [, int &$errorcode ]]] )
msg_receive用于讀取消息隊列中的數(shù)據(jù)。
msg_remove_queue ( resource $queue )
msg_remove_queue用于銷毀一個隊列。

示例代碼_1只是展示了php操作消息隊列函數(shù)的應(yīng)用。下面的代碼具體描述了進程間通信的場景
復(fù)制代碼 代碼如下:
<?php
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($message_queue_key, 0666);
$pids = array();
for ($i = 0; $i < 5; $i++) {
//創(chuàng)建子進程
$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)
?>

運行結(jié)果為:
復(fù)制代碼 代碼如下:
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

這段程序每次的運行結(jié)果都會不同,這正說明了多進程的異步性。從結(jié)果也能看出消息隊列FIFO特性。
以上便是我研究的一點心得。接下來將會繼續(xù)研究php利用信號、socket等進行進程間通信的方法。

php技術(shù)PHP下操作Linux消息隊列完成進程間通信的方法,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久亚洲国产成人影院 | 久草热8精品视频在线观看 久草青青在线 | 久久99国产视频 | 国产精品无码AV天天爽人妻蜜桃 | 亚洲无AV在线中文字幕 | 扒开双腿疯进出爽爽爽动态图 | 无限资源好看片2019免费观看 | 囯产免费久久久久久国产免费 | 少妇久久久久久被弄高潮 | 月夜直播免费观看全集 | 亚洲色噜噜狠狠站欲八 | 国产成人精品区在线观看 | 欧美成人精品高清在线观看 | 美女被免费喷白浆视频 | 国产亚洲欧洲日韩在线观看 | MMM日本兽交 | 国产色偷偷男人的天堂 | 国产精品高清在线观看93 | 欧美亚洲国内日韩自拍视频 | 狠狠色丁香婷婷久久综合 | 饥渴难耐的浪荡艳妇在线观看 | WWW夜片内射视频在观看视频 | 国产午夜精品久久久久九九 | 东热rq大乱交 | 免费久久狼人香蕉网 | 妈妈的朋友6未删减版完整在线 | 久久青草费线频观看国产 | 国产欧美日韩网站 | 高h 纯肉文 | 男人狂躁进女人免费视频公交 | 亚洲AV无码久久流水呻蜜桃久色 | 国产日韩精品一区二区三区在线 | 国产人A片777777久久 | 久草精品视频 | 国产精品视频人人做人人爽 | 成人性生交大片免费看中文 | 一本到道免费线观看 | 久久精品视频在线看 | 国产真实乱对白精彩 | 99国产精品久久 | 美女夫妻内射潮视频 |