海运的博客

PHP进程间通信System V消息队列

发布时间:January 9, 2014 // 分类:PHP // No Comments

多进程:

<?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

评论已关闭

分类
最新文章
最近回复
  • 1: 方法一ngtcp2要改下:./configure PKG_CONFIG_PATH=/usr/l...
  • 海运: 关闭服务器
  • 海风: override.battery.charge.low以及override.battery.r...
  • koldjf: 不能过滤
  • 杰迪武士: 此文甚好甚强巨,依照此文在树莓派2 + Rasbian上部署成功 感谢博主美文共赏
  • 海运: ups不知有没选项可设置此参数,不过你可以在另外一台电脑上安装nut客户端自动关机。
  • kgami: 想请教一下,设置了的电脑自动关机之后,几秒后UPS怎么也跟着关机了,导致另外一台电脑没关机就断...
  • 海运: 写的很详细了啊,/etc/nut/hosts.conf用以nut-cgi连接nut服务器参数,...
  • ryan: 请问下nginx配置好了,怎么和这个nut链接呢?最后可视化管理这块能给个详细一点的教程么?谢谢。
  • 1: /etc/config/fstab配置文件 https://openwrt.org/zh/do...