加入收藏 | 设为首页 | 会员中心 | 我要投稿 均轻资讯网 (https://www.ijunqing.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP进程间通信的方式,php进程间通讯实例分析

发布时间:2022-10-26 15:03:13 所属栏目:PHP教程 来源:
导读:  本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:

  php单进程单线程处理批量任务太慢了,受不鸟了,但是php不能多线程,最终选择了多进程处理批量任务.

  php多进程主要使用for进
  本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:
 
  php单进程单线程处理批量任务太慢了,受不鸟了,但是php不能多线程,最终选择了多进程处理批量任务.
 
  php多进程主要使用for进行分裂,然后利用的unix/linux的信号量进行进程间通讯.
 
  本例使用的是:生产者=>消费者=>收集器,的模式.
 
  // ===== 全局变量 =====
 
  // ipc进程间通讯
 
  $key = ftok(__FILE__, "a");
 
  $queue = msg_get_queue($key);
 
  // 进程ID
 
  $producer_pid = 0;
 
  $consumers_pid = array();
 
  $collector_pid = posix_getpid();
 
  // ===== 消费者 =====
 
  for ($i=0; $i < 2; $i++) {
 
  $consumer_pid = pcntl_fork();
 
  if ($consumer_pid == -1) {
 
  exit("could not fork!\n");
 
  } else if ($consumer_pid) {
 
  // pcntl_wait($status);
 
  echo "consumer_pid: $consumer_pid\n";
 
  $consumers_pid[] = $consumer_pid;
 
  } else {
 
  $pid = posix_getpid();
 
  echo "consumer_pid: $pid start\n";
 
  while (true) {
 
  msg_receive($queue, $pid, $msgtype, 1024, $message);
 
  if ($message == "exit") {
 
  break;
 
  }
 
  // 数据处理
 
  $n = intval($message);
 
  msg_send($queue, $collector_pid, $n * $n);
 
  }
 
  exit("consumer ok!\n");
 
  }
 
  }
 
  // ===== 产生者 =====
 
  $producer_pid = pcntl_fork();
 
  if ($producer_pid == -1) {
 
  exit("could not fork!\n");
 
  } else if ($producer_pid) {
 
  // pcntl_wait($status);
 
  echo "producer_pid: $producer_pid\n";
 
  } else {
 
  $pid = posix_getpid();
 
  echo "producer_pid: $pid start\n";
 
  $n = 0;
 
  for ($i=0; $i < 10; $i++) {
 
  foreach ($consumers_pid as $consumer_pid) {
 
  $n++;
 
  msg_send($queue, $consumer_pid, $n);
 
  }
 
  sleep(1);
 
  }
 
  foreach ($consumers_pid as $consumer_pid) {
 
  msg_send($queue, $consumer_pid, "exit");
 
  }
 
  sleep(1);
 
  msg_send($queue, $collector_pid, "exit");
 
  exit("producer ok!\n");
 
  }
 
  // ===== 收集器 =====
 
  while (true) {
 
  msg_receive($queue, $collector_pid, $msgtype, 1024, $message);
 
  if ($message == "exit") {
 
  break;
 
  }
 
  echo sprintf("% 5d: %d\n", $msgtype, $message);
 
  }
 
  exit("collector ok!\n");
 
  希望本文所述对大家PHP程序设计有所帮助。
 

(编辑:均轻资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!