一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP下操作Linux消息隊列完成進程間通信的方法

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

2019-11-05 11:06PHP教程網 PHP教程

當我們開發的系統需要使用多進程方式運行時,進程間通信便成了至關重要的環節。消息隊列(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: 

復制代碼代碼如下:


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 韩国久播影院理论片不卡影院 | 无限资源在线观看播放 | 亚洲精品第一国产综合 | 青青草综合网 | 午夜久久影院 | 午夜无码国产理论在线 | 欧乱色国产精品兔费视频 | 国产视频一区二区 | 亚洲国产成人精品不卡青青草原 | 国产精品一区二区在线观看完整版 | 高h文道具| 四虎影院大全 | 大胸纲手被羞羞漫画网站 | 俄罗斯男男激情1069gay | haodiaose在线精品免费视频 | 性柔术18性13处交 | 精品伊人| 青青草原国产一区二区 | 顶级欧美做受xxx000 | 波多野结衣 在线播放 | 亚洲精品AV无码喷奶水糖心 | 亚洲免费在线观看视频 | a级在线看 | 闺蜜的样子小说安沁在线阅读 | 国产欧美日韩视频在线观看一区二区 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 | 亚洲AV永久无码精品澳门 | 国产一区私人高清影院 | 国产美女下面流出白浆视频 | 糖心视频在线观看 | 黄版快手 | 爱情岛论坛亚洲品质自拍视频 | 女子监狱第二季未删减在线看 | 国产欧美日韩高清专区ho | 亚洲欧美日韩综合在线播放 | 免费国产成人 | 精品99一区二区三区麻豆 | jux629三浦理惠子在线播放 | 二次元美女挤奶漫画 | 精品一区二区三区五区六区七区 | 糖心视频在线观看 |