先看下我已经安装的php版本

  1. PHP 7.3. (cli) (built: Jul ::) ( NTS )
  2. Copyright (c) - The PHP Group
  3. Zend Engine v3.3.7, Copyright (c) - Zend Technologies

php实现多进程需要安装pcntl模块,这个模块是php官方提供的,所以我们可以在PHP源码中找到,下载 php7.3.7 源码并解压到  /home 目录下,这时我们需要的扩展 pcntl 在  /home/php-7.3.7/ext/pcntl

依次执行以下命令

  1. phpize
  2. ./configure --with-php-config=/usr/local/bin/php-config
  3. make & make install

这里面确定 php-config 文件的路径可以使用   find / -name php-config   最后生成 pcntl.so 文件。

然后找到 php的ini文件所在路径 可以使用   php --ini   命令查看

至于php的扩展模块路径可以使用  php -i | grep extension_dir   查看,然后将生成的so文件拷到模块路径下并且将  extension=pcntl  加到php.ini文件中

使用 php -m 查看模块是否被加载!到这里pcntl 模块就安装好啦,下面开始编码

  1. for ($i = 0; $i < 3; $i++){
  2. $pid = pcntl_fork();
  3. if ($pid == -1) {
  4. die("开启进程失败");
  5. } elseif ($pid) {
  6. echo "启动子进程 $pid \n";
  7. } else {
  8. echo "子进程 ".getmypid()." 正在处理任务\n";
  9. sleep(rand(5,10));
  10. exit;
  11. }
  12. }
  13.  
  14. while (pcntl_waitpid(0, $status) != -1) {
  15. $status = pcntl_wexitstatus($status);
  16. echo "子进程推出,状态码 $status \n";
  17. }

pcntl_fork()函数创建一个子进程,成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

pcntl_waitpid() — 等待或返回fork的子进程状态,挂起当前进程的执行直到参数pid指定的进程号的进程退出, 或接收到一个信号要求中断当前进程或调用一个信号处理函数。返回的值可以是-1,0或者 >0的值, 如果是-1, 表示子进程出错, 如果>0表示子进程已经退出且值是退出的子进程pid,至于如何退出, 可以通过$status状态码反应

执行效果

  1. root@4226aaf8d937:/home/demo# php index.php
  2. 启动子进程 150
  3. 启动子进程 151
  4. 启动子进程 152
  5. 子进程 152 正在处理任务
  6. 子进程 151 正在处理任务
  7. 子进程 150 正在处理任务
  8. 子进程推出,状态码 0
  9. 子进程推出,状态码 0
  10. 子进程推出,状态码 0
  1. root@4226aaf8d937:/# ps -aux
  2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  3. root 1 0.0 0.3 3976 3180 pts/0 Ss 04:42 0:00 bash
  4. root 17 0.0 0.3 3868 3184 pts/1 Ss 04:48 0:00 bash
  5. root 149 0.3 2.1 79740 21888 pts/0 S+ 06:18 0:00 php index.php
  6. root 150 0.0 0.6 79740 6664 pts/0 S+ 06:18 0:00 php index.php
  7. root 151 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.php
  8. root 152 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.php
  9. root 153 0.0 0.2 7640 2660 pts/1 R+ 06:18 0:00 ps -aux

当子进程被使用 kill -9 进程id 强制杀死的时候如何处理?

  1. <?php
  2. $pid_arr = [];
  3. for ($i = 0; $i < 3; $i++){
  4. $pid = pcntl_fork();
  5. if ($pid == -1) {
  6. die("开启进程失败");
  7. } elseif ($pid) {
  8. echo "启动子进程 $pid \n";
  9. array_push($pid_arr, $pid);
  10. } else {
  11. echo "子进程 ".getmypid()." 正在处理任务\n";
  12. sleep(rand(5,10));
  13. exit;
  14. }
  15. }
  16.  
  17. for ($i=0; $i < count($pid_arr); $i++) {
  18. while (pcntl_waitpid($pid_arr[$i], $status) != -1) {
  19. if(!pcntl_wifexited($status)){
  20. //进程非正常退出
  21. if(pcntl_wifsignaled($status)){
  22. $signal = pcntl_wtermsig($status);
  23. //不是通过接受信号中断
  24. echo "子进程 $pid_arr[$i] 属于非正常停止,接收到信号 $signal \n";
  25. }else{
  26. print_r("子进程 $pid_arr[$i] 完成任务并退出 \n");
  27. }
  28.  
  29. }else{
  30. //获取进程终端的退出状态码;
  31. $code = pcntl_wexitstatus($status);
  32. print_r("子进程 $pid_arr[$i] 正常结束任务并退出,状态码 $status \n ");
  33. }
  34. }
  35. }

我们打开两个窗口,其中一个

【多进程】php多进程编程的更多相关文章

  1. python 使用多进程实现并发编程/使用queue进行进程间数据交换

    import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...

  2. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  3. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  4. python多进程与多线程编程

    进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...

  5. python多进程和多线程编程

    17 多线程和多进程并发 The modules described in this chapter provide support for concurrent execution of code. ...

  6. Day11 多进程与多线程编程

    一.进程与线程 1.什么是进程(process)? An executing instance of a program is called a process. Each process provi ...

  7. Linux 并发服务器编程(多进程)

    文章目录 说明 注意事项 server.c client.c 运行截图 说明 在Linux中通过流式套接字编程(TCP),实现一个并发服务器的访问回显,适合刚学完Linux套接字编程的朋友进行巩固训练 ...

  8. PHP系统编程--01.多进程与多线程

    PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程.fork调用后执行的代码将是并行的. PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特 ...

  9. Linux网络编程(3)——多进程、多线程

    在我的里面已经介绍了linux以下c的进程.线程接口,这里就不做过多阐述了. 多进程 这里多进程採用传统的多进程模型.每当有client发来的连接时创建一个进程来处理连接,一个子进程相应一个连接. 有 ...

  10. 单进程与 多进程关系及区别(多进程系统linux)

    单进程编程:顺序执行 数据同步 复杂度低 用途单一 多进程编程:同时执行 数据异步 复杂度高 用途广泛 1. 多进程的优势在于任务的独立性,比如某个任务单独作为一个进程的话,崩溃只影响自己的服务,其他 ...

随机推荐

  1. asyncio与gevent并发性能测试

    asyncio与gevent并发性能测试 在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有as ...

  2. linux/videodev.h: No such file or directory错误解决方法

    sudo apt-get install libv4l-dev* file yum install libv4l-dev* yum install libv4l-dev* 上面错误的问题是两个2.4以 ...

  3. 算法习题---4-6莫尔斯电码(UVa508)

    一:题目 A-Z0-9分别对应一些莫尔斯电码字符串 A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. ...

  4. java中把文件拷贝到指定目录下最简单几种方法

    java中把文件拷贝到指定目录下最简单几种方法   String savePath = "D:/file";// 文件保存到d盘的file目录下 File savefile = n ...

  5. 前后端分离session不一致问题

    前端VUE.js 后端SSM 问题描述: 该项目的登录先由后台生成一验证码返回给前端,并保存在session中,不过当前端登录时,后台会报 NullPointerException,看前端的请求头才发 ...

  6. ubuntu18.04 server配置静态ip,新的网络工具netplan的使用方法【转:http://forum.ubuntu.org.cn/viewtopic.php?t=487463】

    最新发布的ubuntu18.04 server,启用了新的网络工具netplan,对于命令行配置网络参数跟之前的版本有比较大的差别,现在介绍如下:1.其网络配置文件是放在/etc/netplan/50 ...

  7. 获取网卡名称及其IP地址的方法

    代码 # -*- coding: utf-8 -*- import psutil #获取网卡名称和其ip地址,不包括回环 def get_netcard(): netcard_info = [] in ...

  8. html转图片网页截屏(二)PhantomJS

    关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...

  9. .Net Core 请求上下文IHttpContextAccessor

    namespace Microsoft.AspNetCore.Http { public interface IHttpContextAccessor { HttpContext HttpContex ...

  10. APK在Android Studio下如何签名

    apk签名的意义 Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的! Andro ...