海运的博客

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

评论已关闭

分类
最新文章
最近回复
  • 海运: 正常情况下编译整个内核执行make menuconfig后就不会出现此提示,当单独编译单个模块...
  • oijq: 就是用的armbian的配置文件哈,按你的教程做的,在执行make LOCALVERSION=...
  • 海运: 使用armbian的配置文件,其它添加或修改自己懂的部分,不懂的就不要碰了。
  • oijq: 编译时这些选项全部选Y吗?Actions Semi Platforms (ARCH_ACTIO...
  • 海运: n1编译bbr内核模块参考这个:https://www.haiyun.me/archives/...
  • jiqz: make M=net/ipv4/ CONFIG_TCP_CONG_BBR=m modules编...
  • ruralhunter: 哦,文档里应该是对的,是.config
  • ruralhunter: cp /mnt/boot/config-4.18.7-aml-s9xxx .config这里应...
  • 海运: 你是编译不成功呢?还是编译后不能运行呢?还是运行后不能访问web界面呢?
  • 白墨: 可能不清楚就是编译安装后启动后访问不了web界面