多进程环境要求

  • Linux 系统
  • php-cli 模式
  • pcntl 扩展 或 swoole 扩展

pcntl 扩展

<?php
$str = "hello world!" . PHP_EOL;
// 派生一个子进程,子进程会复制主进程中的上下文
// pcntl_fork 函数在主进程中返回子进程的进程ID,在子进程返回0,失败在主进程返回-1
$pid = pcntl_fork();
// 这里开始的代码,会被主进程、子进程共同执行
echo $str;
if($pid > 0) {
echo "我是主进程,子进程的pid是{$pid}" . PHP_EOL;
} elseif($pid == 0) {
echo "我是子进程,我的pid是". getmypid() . PHP_EOL;
}else{
echo "我是主进程,开启子进程失败" . PHP_EOL;
}

swoole 扩展

<?php
use Swoole\Process;
$str = "hello world!" . PHP_EOL;
// 实例化一个进程类
$process = new Process(function() use($str) {
echo $str;
echo "我是子进程,我的pid是" . getmypid() . PHP_EOL;
});
// 开启子进程,成功返回子进程的PID,失败返回false
$pid = $process->start();
echo $str;
if($pid > 0){
$status = Process::wait(true);
echo "我是主进程,子进程的pid是{$pid}" . PHP_EOL;
}else{
echo "我是主进程,开启子进程失败" . PHP_EOL;
}

进程通信

通常情况下,各个进程之间的内存空间是相互独立的,不能互相访问。

在PHP多进程中,pcntl_fork出来的子进程只是复制了父进程的上下文内容,并非共享同一个内存空间,多进程之间无法直接通信。

进程间通信的几种方式:

  • 管道通信:分为有名管道,无名管道等;
  • 消息队列通信:使用linux的消息队列,需要借助sysvmsg扩展;
  • 进程信号通信;
  • 共享内存通信:映射一段能被其他进程访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问;
  • 套接字通信;
  • 第三方通信:使用文件、mysql、redis等方法实现通信。

进程信号

进程信号(Signals)是Unix系统中使用的最古老的进程间通信方法之一。操作系统通过信号来通知进程系统中发生了某种预先规定好的事件,它也是用户进程之间通信和同步的一种原始机制。一个键盘中断或者一个错误条件都有可能产生一个信号。Shell也使用信号向它的子进程发送作业控制信号。

在一个信号的生命周期中有两个阶段:生成和传送。

当一个事件发生时,需要通知一个进程,这时就生成了一个信号。

当进程识别出信号的到来,会采取适当的动作来传送或处理信号。

在信号到来和进程对信号进行处理之间,信号在进程上挂起(pending)。

主要的信号源如下:

  • 异常:进程运行过程中出现异常;
  • 其它进程:一个进程可以向另一个或一组进程发送信号;
  • 终端中断:Ctrl-C,Ctrl-\等;
  • 作业控制:前台、后台进程的管理;
  • 分配额:CPU超时或文件大小突破限制;
  • 通知:通知进程某事件发生,如I/O就绪等;
  • 报警:计时器到期。

常见信号

  • SIGHUP: 从终端上发出的结束信号;
  • SIGINT: 来自键盘的中断信号(Ctrl-C);
  • SIGQUIT:来自键盘的退出信号(Ctrl-\);
  • SIGFPE: 浮点异常信号(例如浮点运算溢出);
  • SIGKILL:结束接收此信号的进程;
  • SIGALRM:进程的定时器到期时,发送该信号;
  • SIGTERM:kill 命令发出的信号;
  • SIGCHLD:标识子进程停止运行或已运行结束的信号;

信号缺省动作

  • 异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,然后终止进程。
  • 退出(exit):不产生core文件,直接终止进程。
  • 忽略(ignore):忽略该信号。
  • 停止(stop):挂起该进程。
  • 继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。

进程可以对信号所采取的操作

  • 忽略信号:进程可忽略产生的信号,但 SIGKILL 和 SIGSTOP 信号不能被忽略,必须处理(由进程自己或由内核处理)。进程可以忽略掉系统产生的大多数信号。
  • 阻塞信号:进程可选择阻塞某些信号,即先将到来的某些信号记录下来,等到以后(解除阻塞后)再处理它。
  • 由进程处理该信号:进程本身可在系统中注册处理信号的处理程序地址,当发出该信号时,由注册的处理程序处理信号。
  • 由内核进行缺省处理:信号由内核的缺省处理程序处理,执行该信号的缺省动作。例如,进程接收到SIGFPE(浮点异常)的缺省动作是产生core并退出。大多数情况下,信号由内核处理。

信号没有固有的优先级。如果为一个进程同时产生了两个信号,这两个信号会以任意顺序出现在进程中并会按任意顺序被处理。另外,也没有机制用于区分同一种类的多个信号。如果进程在处理某个信号之前,又有相同的信号发出,则进程只能接收到一个信号。进程无法知道它接收了一个还是多个SIGCONT信号。

PHP 中的多进程使用,进程通信、进程信号等详解的更多相关文章

  1. Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  2. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

  3. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  4. ArcGIS中的北京54和西安80投影坐标系详解

    ArcGIS中的北京54和西安80投影坐标系详解 1.首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为地理 ...

  5. Nginx服务器中配置非80端口的端口转发方法详解

    这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下 nginx可以很方便的配置成反向代理服务器: 1 2 ...

  6. java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解

    java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解 我用的是office word 2016版 XWPFRun是XWPFDocument中的一段文本对象(就是一段文 ...

  7. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

  8. Mybatis中接口和对应的mapper文件位置配置详解

    Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...

  9. 配置tomcat服务器内存大小中的Xms、Xmx、PermSize、MaxPermSize 详解

    1.参数的含义 -vmargs -Xms256m -Xmx512m -XX:PermSize=256M -XX:MaxPermSize=512M -vmargs 说明后面是VM的参数,所以后面的其实都 ...

  10. Android java程序员必备技能,集合与数组中遍历元素,增强for循环的使用详解及代码

    Android java程序员必备技能,集合与数组中遍历元素, 增强for循环的使用详解及代码 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 For ...

随机推荐

  1. SpringMVC(2):JSON

    一,JSON 介绍 JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效 ...

  2. springboot整合jetty

    1.jetty介绍 通常我们进行Java Web项目开发,必须要选择一种服务器来部署并运行Java应用程序,Tomcat和Jetty作为目前全球范围内最著名的两款开源servlet容器,该怎么选呢. ...

  3. 多媒体音视频处理及FFmpeg使用技巧总结

    截图 ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg 连续截图 ffmpeg -y -i input.mp4 -vf "fp ...

  4. 【C/C++】【输入】关于scanf:输入空格,多次使用

    一.C/C++中带空格字符串的输入 C++中的cin和C中的scanf都是遇到空格或回车结束. 如果要让scanf接收空格,可以用读入字符集合的方式.%[] char a[100]; scanf(&q ...

  5. Linkerd Service Mesh 授权策略(Server & ServerAuthorization)

    简介 Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问. 在 linkerd 安装期间,policyContr ...

  6. 虚拟机快照和linux基础命令

    虚拟机快照 磁盘"快照"是虚拟机磁盘文件(VMDK)在某个点及时的副本.可以通过使用恢复到快照来保持磁盘文件和系统存储. 1.拍摄快照 拍摄快照前先关机,然后右键点击虚拟机=> ...

  7. [BUUCTF]PWN4——pwn1_sctf_2016

    [BUUCTF]PWN4--pwn1_sctf_2016 题目网址:https://buuoj.cn/challenges#pwn1_sctf_2016 步骤: 例行检查,32位,开启nx(堆栈不可执 ...

  8. [BUUCTF]PWN——picoctf_2018_rop chain

    picoctf_2018_rop chain 附件 步骤: 例行检查,32位,开启了NX保护 试运行一下程序,看到输入太长数据会崩溃 32位ida载入,习惯性的检索程序里的字符串,看见了flag.tx ...

  9. textarea标签换行符以br存入数据库 ,br转 textArea换行符

    textArea换行符转 <br/> textarea标签回车符是/n,在html里识别回车是<br/>,在存入数据库之前要进行转换成<br/>,在取出展示在htm ...

  10. CentOS7学习笔记(六) 用户权限管理

    用户.用户组与文件的关系 在了解权限管理之前先创建一些用户和用户组便于后续学习,在root用户下操作: # 创建两个用户组 [root@localhost data]# groupadd kaifa ...