一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP下操作Linux消息隊(duì)列完成進(jìn)程間通信的方法

關(guān)于Linux系統(tǒng)進(jìn)程通信的概念及實(shí)現(xiàn)可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/
  關(guān)于Linux系統(tǒng)消息隊(duì)列的概念及實(shí)現(xiàn)可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
  php的sysvmsg模塊是對(duì)Linux系統(tǒng)支持的System V IPC中的System V消息隊(duì)列函數(shù)族的封裝。我們需要利用sysvmsg模塊提供的函數(shù)來(lái)進(jìn)進(jìn)程間通信。先來(lái)看一段示例代碼_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);
//向消息隊(duì)列中寫(xiě)
msg_send($message_queue, 1, "Hello,World!");
$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status);
//從消息隊(duì)列中讀
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
print_r($message."/r/n");
msg_remove_queue($message_queue);
?>

這段代碼的運(yùn)行結(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!

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

示例代碼_1只是展示了php操作消息隊(duì)列函數(shù)的應(yīng)用。下面的代碼具體描述了進(jìn)程間通信的場(chǎ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)建子進(jìn)程
$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;
//需要判斷隊(duì)列是否為空,如果為空就退出
//break;
} while(true)
?>

運(yùn)行結(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

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

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

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

主站蜘蛛池模板: 国产精品免费一区二区区 | 日韩六九视频 | 香蕉成人啪国产精品视频综合网 | 337p日本大胆欧美人术艺术精品 | 91成人午夜精品福利院在线观看 | 六月婷婷网视频在线观看 | 免费视频一区二区三区四区 | 久草中文在线观看 | 韩国资源视频一区二区三区 | 成年人香蕉视频 | 欧美天天影院 | 成人五月网 | 久久国产香蕉 | 在线观看国产情趣免费视频 | 国产日韩欧美成人 | 久久er精品视频 | 精品免费国产一区二区三区 | 国产成人在线播放视频 | 五月婷婷影视 | 亚洲另类图片专区 | 国产综合变态自虐重口另类 | 午夜看片网址 | 国产福利在线小视频 | 91久久香蕉国产线看 | 久草国产精品 | 爱五月 | 欧美日韩亚洲国产千人斩 | 国内精品久久久久久久久野战 | 97日韩 | 欧美特黄特刺激a一级淫片 欧美特黄特色aaa大片免费看 | 天天偷窥网 | 久久99国产一区二区三区 | 国产精品揄拍一区二区 | 99久久精品费精品国产 | 美国毛片亚洲社区在线观看 | 国产 欧美 日产中文 | 欧美激情一区二区三区中文字幕 | 成人午夜免费视频免费看 | 四虎网站 | 亚洲综合色吧 | 亚洲伊人精品 |