当前位置: 首页 > 编程笔记 >

php进程间通讯实例分析

魏襦宗
2023-03-14
本文向大家介绍php进程间通讯实例分析,包括了php进程间通讯实例分析的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:

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

php多进程主要使用for进行分裂,然后利用的unix/linux的信号量进行进程间通讯.

本例使用的是:生产者=>消费者=>收集器,的模式.

<?php
// ===== 全局变量 =====
// 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相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

 类似资料:
  • 为了方便进程内部通讯,进行数据交换。imi v1.2.0 版本新增了内部进程间通讯封装。 使用 Swoole 提供的 sendMessage() 和 onPipeMessage 事件 实现。 在 onPipeMessage 事件中,收到指定结构的数据,就会触发相应事件。 我们只需要监听事件就行了。 介绍 数据结构 [ 'action' => '动作名', // 此字段固定

  • 本文向大家介绍php实现与erlang的二进制通讯实例解析,包括了php实现与erlang的二进制通讯实例解析的使用技巧和注意事项,需要的朋友参考一下 一般来说网络通讯常用的方式有2种:文本通讯和二进制通讯。php与erlang之间实现文本通讯比较简单,这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法。实现步骤如下: erlang端代码: php端代码: 运行正常的情况

  • 8.1. 概述 进程间通讯描述的是同一台计算机的不同应用程序之间的数据交换机制。 但不包括网络通讯方式。 如果需要经由网络,在彼此运行在不同计算机上的应用程序之间交换数据,请看第 7 章 异步输入输出,该章讲述了 Boost.Asio 库。 本章展示了 Boost.Interprocess 库,它包括众多的类,这些类提供了操作系统相关的进程间通讯接口的抽象层。 虽然不同操作系统的进程间通讯概念非常

  • 关于扩展包进程间通讯(以下简称 IPC)的基本概念,请先阅读 IPC 简介。 我们前面介绍了主进程中的 入口程序 和渲染进程中的 面板程序 的基本声明方法和交互方式,接下来我们将结合实际需求介绍两种进程间通讯的详细工作流程。 本节提及的所有相关 API 均可查询 Editor.Ipc 主进程 API 和 Editor.Ipc 渲染进程 API。 发送消息 主进程向面板发送消息 在主进程中,主要使用

  • 计算机进程之间几乎有和人与人之间一样多的交流。我们不应低估进程间通讯的难度。 如果你的朋友只使用形体语言,那么你光注意语言暗示对你是一点用都没有。同样, 两个进程之间只有达成了通讯的方法以及建筑在该方法之上的习惯的共识以后才能通讯。 和任何通讯一样,这些需要达成共识的习惯的范围从词法到实际用法:几乎是从用什么 方言到说话的顺序的一切东西。这些习惯是非常重要的,因为我们都知道如果光有语义 而没有环境

  • 本文向大家介绍python socket多线程通讯实例分析(聊天室),包括了python socket多线程通讯实例分析(聊天室)的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python socket多线程通讯方法。分享给大家供大家参考,具体如下: 希望本文所述对大家Python程序设计有所帮助。

  • 本文向大家介绍PHP多进程编程实例,包括了PHP多进程编程实例的使用技巧和注意事项,需要的朋友参考一下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧。这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享。 1. 准备 在动手之前,请确定你用的不是M$ W

  • 本文向大家介绍PHP守护进程实例,包括了PHP守护进程实例的使用技巧和注意事项,需要的朋友参考一下 php也是可以直接进行守护进程的启动与终止的,相对于shell来说会简单很多,理解更方便,当然了php的守护进程要实现自动重启还是要依赖于shell的crontab日程表,每隔一段时间去执行一次脚本看脚本是否需要重启,如果需要则杀掉进程删除RunFile文件,重新启动并在RunFile文件中写入pi