php 防止僵尸程序,PHP多进程编程之僵尸进程问题
经过运用pcntl_fork函数,我们现已有了新的子进程,而子进程接下来完结我们需求处理的内容,那么我们就暂时叫做service()吧,而且我们需求很多个service()进行处理,再次参照我们之前的需求,父进程需求一向循环读取配置文件,等候文件发作改动。经过对pcntl_fork的办法,很简单我们就能够写出如下代码:
$res = config();//kill进程
for($i = 0; $i < $res[sum]; $i++) {
$pid = pcntl_fork();
if ($pid == 0) {
service();
return;
}
}
代码中注释的当地我们需求在配置文件中发作改动的时分杀死进程,杀死进程的的办法很简单,能够运用kill指令直接杀死,比方(假定pid为123):
1 kill 123
可是我们发现,运用这个杀死进程的办法并没有真实的把进程杀死,这个子进程被杀身后还占用这个进程的资源,我们成为僵尸进程,僵尸进程是运用kill指令无法杀死的。想要处理这个问题,我们能做的只要两种办法。
1. shutdown
2. 杀死该进程的父进程。
可是这两种办法都不可,由于这个程序的意图是监控常驻在服务器内,服务器不能封闭,而且父进程也不能被干掉。这时分我们看到了官方文档关于fork办法的解说:
1 pcntl_wait($status); //等候子进程中止,避免子进程成为僵尸进程。
本来有种办法能够避免进程成为僵尸进程,可是,官网给出的代码是这姿态的:
1 $pid = pcntl_fork();
2 //父进程和子进程都会履行下面代码
3 if ($pid == -1) {
4 //错误处理:创立子进程失利时回来-1.
5 die('could not fork');
6 } else if ($pid) {
7 //父进程会得到子进程号,所以这儿是父进程履行的逻辑
8 pcntl_wait($status); //等候子进程中止,避免子进程成为僵尸进程。
9 } else {
10 //子进程得到的$pid为0, 所以这儿是子进程履行的逻辑。
11 }
什么意思呢?就是父进程会等候子进程运转,等子进程运转完毕之后,才会进行下一步,而且也会消除僵尸进程。可是这儿又和我们的需求不符合了,我们的子进程为一个死循环的程序,不断的查找输出,更本没有完毕的时分,而且我们需求的是异步处理而不是同步。可是这个办法能够用吗?其实当然能够。
在pcntl_wait的文档中是这么解说这个函数的:
wait函数刮起当时进程的履行直到一个子进程退出或接收到一个信号要求中止当时进程或调用一个信号处理函数。 如果一个子进程在调用此函数时现已退出(俗称僵尸进程),此函数马上回来。子进程运用的一切体系资源将 被开释。关于wait在您体系上作业的具体标准请查看您体系的wait(2)手册。
我们发现,当这个函数发现子进程成为了僵尸进程就会开释僵尸进程的资源——条件是这个僵尸进程为这个父进程的子进程。那么我们就能够奇妙的运用这个办法让这些僵尸进程开释资源了,所以就有了如下代码:
1 posix_kill(123, 9);
2 pcntl_wait($status);
这样我们先运用kill干掉这个进程,这个进程就不会再运转了,可是这个进程成为了僵尸进程,占用着资源,我们下一句就履行一次pcntl_wait()让这些僵尸进程开释资源,这样,子进程才真实的被停止了,僵尸进程被消除了。
php 防止僵尸程序,PHP多进程编程之僵尸进程问题相关推荐
- Linux -- 多进程编程之 - 守护进程
内容概要 一.守护进程概述 二.守护进程创建 2.1.创建子进程,父进程退出 2.2.在子进程中创建新会话 2.2.1.进程组和会话期 2.2.2.setsid()函数说明 2.3.改变当前工作目录 ...
- Linux多进程编程之 孤儿进程僵尸进程+wait函数
我们可否想过一个问题:使用fork()函数创建子进程,因为父进程和子进程的执行顺序是随机的 当父进程已经结束了,子进程还会继续存在并正常执行吗? 我们先看这个例子: guer1.c #include& ...
- 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2
并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...
- PHP回顾之多进程编程
转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 session 数据库操作 加解密 Com ...
- socket多进程编程
socket多进程编程 一.服务器并发访问的问题 服务器按处理方式可以分为迭代服务器和并发服务器两类.平常用C写的简单Socket客户端服务器通信,服务器每次只能处理一个客户的请求,它实现简单但效率很 ...
- python编程图文_深入Python多进程编程基础——图文版
多进程编程知识是Python程序员进阶高级的必备知识点,我们平时习惯了使用multiprocessing库来操纵多进程,但是并不知道它的具体实现原理.下面我对多进程的常用知识点都简单列了一遍,使用原生 ...
- 2、GO语言多进程编程
2.GO语言多进程编程 一 进程概念 二 进程创建 四 进程分类 五 进程调度 六 进程状态转换 七 进程运行的问题 7.1 写时复制 7.2 进程回收 八 进程间通信 8.1 进程间通信方式概述 8 ...
- Python多进程编程及多进程间的通信,数据传输
多进程编程及进程间的通信多进程的优缺点进程(process)三态五态(三态的基础上增加了新建态和终止态)进程优先级进程特征孤儿进程僵尸进程要求理解多进程编程进程相关的函数多进程模块Process()创 ...
- python网络与多进程编程篇
章节目录 第十六章 七层协议 第十七章 通信原理 服务器硬件配置 通信原理 第十八章 TCP/UDP传输层协议 传输数据实现流程 TCP协议数据传输 TCP协议三次握手建连接 TCP协议存在的漏洞 半 ...
最新文章
- 服务器可以ghost备份吗_Ghost超详细图文教程 – 克隆备份系统全程图解(下部)...
- mysql底层用什么写的_天天写order by,你知道Mysql底层如何执行吗?
- SharedPreferences详解
- 1.7编程基础之字符串_04石头剪子布
- linux系统脚本安装失败,ubuntu16.04下vim安装失败的原因分析及解决方案
- 华科团队发布 OVIS 遮挡视频实例分割基准数据集
- 鼠标浮动到表格的某行 背景颜色变化[mouseover mouseout 以及mouseenter mouseleave]
- (转) oracle清空数据库脚本
- cad相对坐标快捷键_cad相对坐标怎么输入?CAD中输入西安80坐标绘图的教程
- ICEM使用经验与网格划分错误分析
- 电脑经常出现程序未响应
- jQuery 第二篇
- 医学图像分割方法及卷积神经网络在医学图像分割上的应用
- java基于接口的动态代理
- 怎么样防止文档泄密呢?
- 51单片机实战教程(六 网线测试治具设计)
- Glide(二)Glide的with,load,into
- XP蓝屏死机错误代码查询
- mediapipe bazel 编译问题
- 手机中的IMEI是什么意思?
热门文章
- CheckedListBox 实现RadioButton功能
- 前后端数据交互——ajax(原生及jquery)
- android画布裁剪,Android 2D Graphics学习(二)、Canvas篇2、Canvas裁剪和Region、RegionIterator...
- 如何搭建一个Vue项目
- 杜书笔记: 知乎推荐的100本书
- linux安装命令格式化硬盘,linux格式化硬盘命令是什么?
- 什么水平可以拿到蓝桥杯的省奖?
- Android:Chip、ChipGroups、ChipDrawable
- SCCM2007客户端安装
- RK3399平台开发系列讲解(内核驱动外设篇)6.13、add ethernet(RTL8306MB) support