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

PHP 7.3. (cli) (built: Jul   ::) ( NTS )
Copyright (c) - The PHP Group
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

依次执行以下命令

phpize
./configure --with-php-config=/usr/local/bin/php-config
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 模块就安装好啦,下面开始编码

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

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

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

执行效果

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

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

<?php
$pid_arr = [];
for ($i = 0; $i < 3; $i++){
$pid = pcntl_fork();
if ($pid == -1) {
die("开启进程失败");
} elseif ($pid) {
echo "启动子进程 $pid \n";
array_push($pid_arr, $pid);
} else {
echo "子进程 ".getmypid()." 正在处理任务\n";
sleep(rand(5,10));
exit;
}
} for ($i=0; $i < count($pid_arr); $i++) {
while (pcntl_waitpid($pid_arr[$i], $status) != -1) {
if(!pcntl_wifexited($status)){
//进程非正常退出
if(pcntl_wifsignaled($status)){
$signal = pcntl_wtermsig($status);
//不是通过接受信号中断
echo "子进程 $pid_arr[$i] 属于非正常停止,接收到信号 $signal \n";
}else{
print_r("子进程 $pid_arr[$i] 完成任务并退出 \n");
} }else{
//获取进程终端的退出状态码;
$code = pcntl_wexitstatus($status);
print_r("子进程 $pid_arr[$i] 正常结束任务并退出,状态码 $status \n ");
}
}
}

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

【多进程】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. Windows 10、Ubuntu 18.04 双系统 双硬盘 安装经验总结

    首先说明,我假设读者懂得分区.安装系统,所以不再深入讨论具体操作. 如果需要手把手教程,建议先参考其它Windows中加装Linux的相关文章. 网上其它文章.教程的常见问题是,各家机器配置不一样,安 ...

  2. Web聊天室的实现

    Tornado普通方式实现聊天室 普通的http方式连接的话,基本思路是前端页面通过JS重复连接后端服务器. 核心文件:app.py #!/usr/bin/env python # -*- codin ...

  3. 货币转换函数:CURRENCY_CONVERTING_FACTOR

    针对不同币别要做金额栏位转换 计算规则: 金额 = 原始金额 * 转换率 以下转自博客:https://www.cnblogs.com/sanlly/p/3371568.html 货币转换函数:CUR ...

  4. Docker Machine(十五)

    目录 一.Docker Machine 总览 1.Docker Engine VS Docker Machine 2.环境准备 二.安装 Docker Machine 1.Install Machin ...

  5. laravel进程管理supervisor的简单说明

    原文地址:https://www.cnblogs.com/zhoujinyi/p/6073705.html 背景: 项目中遇到有些脚本需要通过后台进程运行,保证不被异常中断,之前都是通过nohup.& ...

  6. Python进入后台界面(admin)设定

    前言 用过Django框架的童鞋肯定都知道,在创建完Django项目后,每个app下,都会有一个urls.py文件,里边会有如下几行: ※特别要注意下面标红颜色的部分[] 一般情况下不需要修改什么东西 ...

  7. 使用Apache服务部署网站(基于IP,域名,端口)

    本篇主要学习Apache网站服务程序的基本部署,基于IP地址.主机名(域名).端口号的虚拟主机功能. 1.基于IP地址 首先我们需要在虚拟机中线安装Apache服务程序,Apache服务程序的软件包名 ...

  8. 学习笔记:oracle学习二:oracle11g数据库sql*plus命令之常用sqlplus命令、格式化查询结果

    目录 1.常用sqlplus命令 1.1 HELP命令 1.2 describe命令 1.3 SPOOL命令 1.4 其他常用命令 1.4.1 define命令 1.4.2 show命令 1.4.3 ...

  9. [转帖]PostgreSQL 昨天,今天和明天

    PostgreSQL 昨天,今天和明天 http://www.postgres.cn/v2/news/viewone/1/52 原作者:何伟平(laser) 创作时间:2005-01-15 11:44 ...

  10. 认识 Spring 框架(一)

    认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP( ...