多进程:
<?php
//生成key
$message_queue_key = ftok(__FILE__, 'a');
//根据生成的key新建队列,也可自定,如123456
$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";
pcntl_wait($status);//非阻塞的线程等待,防止僵尸进程的出现
} 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;
//获取队列内消息数
$a = msg_stat_queue($message_queue);
if($a['msg_qnum'] == 0){
break;
}
} while(true)
?>
父子进程:
<?php
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($message_queue_key, 0666);
$pid = pcntl_fork();
if ($pid==-1) {
die("cannot fork");
} else if ($pid) { //父进程
pcntl_wait($status);
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
echo $message;
} else {
$pid = posix_getpid(); //子进程
msg_send($message_queue, 1, "this is process.$pid's data\r\n");
}
?>
标签:none