【多进程】php多进程编程
先看下我已经安装的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 ");
}
}
}
- pcntl_wifexited — 检查状态代码是否代表一个正常的退出。
- pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断
- pcntl_wtermsig — 返回导致子进程中断的信号
我们打开两个窗口,其中一个


【多进程】php多进程编程的更多相关文章
- python 使用多进程实现并发编程/使用queue进行进程间数据交换
import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...
- Python多进程与多线程编程及GIL详解
介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
- python多进程与多线程编程
进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...
- python多进程和多线程编程
17 多线程和多进程并发 The modules described in this chapter provide support for concurrent execution of code. ...
- Day11 多进程与多线程编程
一.进程与线程 1.什么是进程(process)? An executing instance of a program is called a process. Each process provi ...
- Linux 并发服务器编程(多进程)
文章目录 说明 注意事项 server.c client.c 运行截图 说明 在Linux中通过流式套接字编程(TCP),实现一个并发服务器的访问回显,适合刚学完Linux套接字编程的朋友进行巩固训练 ...
- PHP系统编程--01.多进程与多线程
PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程.fork调用后执行的代码将是并行的. PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特 ...
- Linux网络编程(3)——多进程、多线程
在我的里面已经介绍了linux以下c的进程.线程接口,这里就不做过多阐述了. 多进程 这里多进程採用传统的多进程模型.每当有client发来的连接时创建一个进程来处理连接,一个子进程相应一个连接. 有 ...
- 单进程与 多进程关系及区别(多进程系统linux)
单进程编程:顺序执行 数据同步 复杂度低 用途单一 多进程编程:同时执行 数据异步 复杂度高 用途广泛 1. 多进程的优势在于任务的独立性,比如某个任务单独作为一个进程的话,崩溃只影响自己的服务,其他 ...
随机推荐
- 关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解
关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解 define('DISCUZ_ROOT', substr(dirname( ...
- Python netaddr CIDR转换
功能 http://netaddr.readthedocs.io/en/latest/tutorial_03.html 将CIDR地址与IP范围相互转化 Convert CIDR to IP rang ...
- js实现随机数及随机数组
js数组元素的随机调用 工作中网页填充数据时需要一个短语库,来拼接在短语句子后边.那就写一个js吧,放在input的keydown或keyup里边用喽. 贴代码: <SCRIPT LANGUAG ...
- 51.Qt-使用ajax获取ashx接口的post数据
由于当前C++项目需要使用ajax库去post调用ashx接口,接口地址如下所示: 需要传递的参数如下: 然后发现qml比较好调用ajax.js库,所以本章通过C++界面去获取qml方法来实现调用as ...
- Net上传文件
Net上传文件 最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先 ...
- 48.javascript基础学习
javascript基础学习: http://www.w3school.com.cn/jsref/index.asp jS的引入方式: 1.行间事件:为某一个具体的元素标签赋予js内容,oncli ...
- jqGrid全部选中
var jqGrid = $("#jqGrid"); // 拿到所有行id var jqGridIDs = jqGrid.getDataIDs(); // 拿到所有选中行id va ...
- eclipse搭建springboot的项目
记录一次自己搭建springboot的经历 springboot项目创建 这里借用别的博主分享的方法 https://blog.csdn.net/mousede/article/details/812 ...
- 在airflow的BashOperator中执行docker容器中的脚本容易忽略的问题
dag模板 from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow. ...
- 【牛客网】Idol Master
[牛客网]Idol Master 也是一道网络流解线性规划 不过需要从小于号的那边解 限制是\(a \leq \sum_{i = 1}^{k} x_{i}\leq b\) 其中\(0 \leq x_{ ...