PHP多进程(一)

news2024/11/18 20:42:29

多进程的作用是一个程序启动多个进程。

一个程序启动起来本应该是一个进程,但它可作为父进程启动多个子进程来一起操作

形成并发操作

pcntl是php官方的多进程扩展,只能在linux环境使用

以下所有操作请在Linux环境下操作:

先认识两个函数,下面是官方文档地址:

PHP: POSIX - Manual

echo '当前进程的pid:'.posix_getpid()."\n";  // 当前进程的标识PID

echo '当前进程的父进程pid:'.posix_getppid()."\n"; // 当前进程父进程的标识PID

看下图  我们发现程序运行完就打印出来了当前进程标识 和 父进程标识 并且已经运行完成了

 接下来我们在程序里面加入一个死循环

echo '当前进程的pid:'.posix_getpid()."\n";  // 当前进程的标识PID

echo '当前进程的父进程pid:'.posix_getppid()."\n"; // 当前进程父进程的标识PID

while(1){
    ;
}

 再次运行

我们再打开一个新的连接 并查看php所有进程

# 查看Linux上的所有php进程

ps -ef | grep php

下一个函数: pcntl_fork

PHP: pcntl_fork - Manual

pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行不同的是父进程执行过程中,得到的fork返回值为子进程号而子进程得到的是0。

官方简介说的已经很清楚了在当前进程当前的位置产生分支( 子进程 )

// 让我们来愉快的学习php的多进程


echo '当前进程的pid:'.posix_getpid()."\n";  // 当前进程的标识PID
echo '当前进程的父进程pid:'.posix_getppid()."\n"; // 当前进程父进程的标识PID


$pid = pcntl_fork();  // 官方说当前fork返回的是子进程的标识PID
echo "我是啥:".$pid."\n";


while(1){
    ;
}

 

哪个进程先运行是无法确定的,也是无法知道的,是由操作系统来决定的,它的进程调度由系统决定

当我们不知道系统先调用那个进程的话,这个时候就需要加入判断


// 让我们来愉快的学习php的多进程


echo '当前进程的pid:'.posix_getpid()."\n";  // 当前进程的标识PID
echo '当前进程的父进程pid:'.posix_getppid()."\n"; // 当前进程父进程的标识PID


$pid = pcntl_fork();  // 官方说当前fork返回的是子进程的标识PID

if($pid == -1){
    die("开启进程失败!"); // 开启失败
}elseif ($pid == 0){
    echo "我是子进程,我的标识PID是".posix_getpid().",我的父进程是:".posix_getppid()."我的子进程是".$pid."\n";
}else{
    echo "我是父进程,我的标识PID是".posix_getpid().",我的父进程是:".posix_getppid()."我的子进程是".$pid."\n";
}

// while(1){
//     ;
// }

运行:

一般情况下:都是父进程先运行,子进程后运行,如果说父进程先运行,先结束,这个时候这个子进程它就没有父亲了,没有了父亲的进程,我们称之为孤儿进程

孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

参考easyswoole官方的文档:

孤儿进程

示例:

// 让我们来愉快的学习php的多进程


echo '当前进程的pid:'.posix_getpid()."\n";  // 当前进程的标识PID
echo '当前进程的父进程pid:'.posix_getppid()."\n"; // 当前进程父进程的标识PID


$pid = pcntl_fork();  // 官方说当前fork返回的是子进程的标识PID

if($pid == -1){
    die("开启进程失败!"); // 开启失败
}elseif ($pid == 0){
    sleep(5);
    echo "我是子进程,我的标识PID是".posix_getpid().",我的父进程是:".posix_getppid()."我的子进程是".$pid."\n";
    while(1){
        echo "别走啊!爸爸"."\n";
        sleep(1);
    }
}else{
    // sleep(2);
    echo "我是父进程,我的标识PID是".posix_getpid().",我的父进程是:".posix_getppid()."我的子进程是".$pid."\n";
    echo "儿子爸爸执行完了我就先跑了"."\n";
}

// while(1){
//     ;
// }

 

 当我们去停止输出 "别走啊!爸爸"的时候

 原因:

父进程必须先让子进程先结束,如果说父进程先结束,子进程被1号进程接管,变成孤儿进程

如果说子进程先结束,父进程后结束,这种情况一般来说是正常的,因为父进程应该回收子进程产生的数据

子进程结束时还会生成一些数据,比如说状态码等其它信息,并没有完全释放,需要父进程回收

孤儿进程没有任何危害,只是需要注意自己的代码逻辑即可。

如果子进程里面是死进程 这个时候就需要强制杀死这个孤儿进程

# 强制杀死进程
kill -9 <pid>   
 
# 杀掉所有同名进程
killall <pname>   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

铜缆测试——近端和远端串扰(NEXT和FNEXT)

如果您非常熟悉铜缆测试&#xff0c;那么很可能听说过串扰——一对或一个通道上传输的信号对另外一对或一个通道产生不良影响的现象。(杂讯) 串扰会对具体的一对导线或整根电缆形成干扰&#xff0c;导致误码或数据无法传输。例如&#xff0c;您是否曾经在电话中听到有其他人说话…

马蹄集 数组最大公约数

给定一个由N个正整数组成的数组&#xff0c;求所有数组元素的最大公约数。 格式 输入格式&#xff1a;第一行输入数组长度N,第二行输入数组元素&#xff0c;整型 空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h> using namespace std;int gcd(int a…

(十八)Java的时间与日期(2)

目录 前言: 一、JDK8新增日期类 二、LocalDate&#xff0c;LocalTime,LocalDateTime 三、Instant时间戳 四、DateTimeFormatter类 五、Duration/Period类 六、ChronoUnit类 前言: JDK 8中增加了一套全新的日期时间API&#xff0c;这套API设计合理&#xff0c;是线程安全的。新的…

ctfshow学习记录-web入门(sql注入191-200)

目录web191web192web193web194web195web196web197web198web199web200九某人来更新啦&#xff1a;2023年第一篇wp新鲜出炉&#xff5e; web191 解答&#xff1a;增加了过滤 过滤了ascii&#xff0c;可以用ord方法代替。&#xff08;这里手册中也有告知~&#xff09; web190的pa…

【数据结构与算法】Trie

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

集合引用类型 下

目录 Map Map.set() Map.get() Map.delete() Map.has() Map.values() Map.entries() Map.clear() 选择Object 还是Map 数据转换 转为数组 转为 JSON 对象转为 Map 数组转为 Map 转为Object WeakMap 基本API 弱键 不可迭代 Set 创建Set实例 Set实例转数组 si…

STM32-启动文件详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转FreeRTOS &#x1f4ac;推荐…

python基础篇之数字类型(下)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

在vue2使用百度脑图的kityminder-core进行二次开发思维导图,在源码中添加新的命令

需求说明&#xff1a;最近在搞kityminder-core的思维导图&#xff0c;需要增加一个给节点添加文件的功能&#xff0c;一直在研究源码&#xff0c;发现都是通过执行命令的方式实现的。一直卡在新增命令的步骤&#xff0c;搞了好多天了今天找到了如何在源码里新增命令&#xff0c…

leetcode 1807. 替换字符串中的括号内容【python3双指针+哈希表】实现过程分析以及思路整理

题目 给你一个字符串s&#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个非空的键。 比方说&#xff0c;字符串"(name)is(age)yearsold"中&#xff0c;有两个括号对&#xff0c;分别包含键"name"和"age"。 你知道许多键对应的值&…

android实现侧边栏:解决header控件无法操作和底部menuitem点击无效的问题

1&#xff1a;目录结构&#xff1a;&#xff08;源码和总结都放在b站&#xff0c;链接在底部&#xff09; 2&#xff1a;实现的大概逻辑&#xff1a; 使用drawerlayout抽屉布局实现&#xff0c;并使用navigationview加载头部和底部 3&#xff1a;核心问题一&#xff1a;header…

用Python来创建7种不同的文件格式

用Python来创建7种不同的文件格式一、用Python来创建7种不同的文件格式1.1、文本文件1.2、CSV文件1.3、Excel文件1.4、压缩文件1.5、XML文件1.6、JSON文件1.7、PDF文件一、用Python来创建7种不同的文件格式 1.1、文本文件 写入 file_name "my_text_file.txt"# 将…

微信小程序——WXML模板语法-条件渲染,列表渲染

一.条件渲染1.wx:if在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码块&#xff1a;也可以用wx:elif和wx:else来添加else判断&#xff1a;实例如下&#xff1a;1.在js文件中定义一个typedata:{type:1 },此时虚拟页面上显示的就是&#xff1a…

二十四、Kubernetes中Deployment(Deploy)控制器详解

1、概述 在kubernetes中&#xff0c;有很多类型的pod控制器&#xff0c;每种都有自己的适合的场景&#xff0c;常见的有下面这些&#xff1a; ReplicationController&#xff1a;比较原始的pod控制器&#xff0c;已经被废弃&#xff0c;由ReplicaSet替代 ReplicaSet&#xff…

kafka/bin/kafka-run-class.sh: line 342: exec: java: not found

本来jps看了下&#xff0c;kafka和zookeeper都起来了&#xff0c;手痒&#xff0c;非要换宝塔的进程守护管理器&#xff0c;选目录为/home/kafka&#xff0c;命令为/home/kafka/bin/zookeeper-server-start.sh /home/kafka/config/zookeeper.properties 就在日志里看到 kafk…

马蹄集 整除的总数

整除的总数 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入正整数N和M,其中N<M。求区间[N,M]中可被K整除的总数。 格式 输入格式&#xff1a;输入正整数N,M和K,空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h&g…

RabbitMQ(二)使用Docker安装

目录1. 拉取 RabbitMQ 镜像2.启动 RabbitMQ 容器3.查看 RabbitMQ 是否启动官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 这篇文章为了方便初学者入门&#xff0c;在 linux 环境下用 docker 直接安装 RabbitMQ&…

【JavaSE】String相关知识

String \ StringBuilder \ StringBufferString的值是不可变的&#xff0c;使用“”或者“”的方法尝试改变String的值并不是在原本的基础上修改&#xff0c;而是赋值给了新的字符串常量引用StringBuffer是线程安全的&#xff0c;使用的是无脑加synchronized的方法这三者的运行速…

10分钟上手一款好用的服务器节点监测工具(Server 酱)

Server 酱简介 Server酱&#xff0c;英文名「ServerChan」&#xff0c;是一款「手机」和「服务器」、「智能设备」之间的通信软件。说人话&#xff1f;就是从服务器、路由器等设备上推消息到手机的工具。开通并使用上它&#xff0c;只需要一分钟&#xff1a; 微信扫码登入设置…

Mysql可视化软件-Navicat和SQLyog

Navicat 可以将mysql可视化的一个软件 可以避免一直在命令行里面敲代码&#xff0c;很难绷 连接 密码写一个你能记住的&#xff0c;不然打不开连接 对应的IP可以是localhost或者127.0.0.1 都是本机 端口号就我们在my.ini写的那个 然后进行我们上面说的操作-新建一个数据库先…