应用场景

一些耗时任务:

  1. 大数据表分表后的统计信息功能
  2. 分批发送短信或邮件功能
  3. 其他可分目标的任务功能(很多种)

所以我们就需要一个常驻内存的任务管理工具,为了保证实时性,一方面我们让它一直执行任务(适当的睡眠,保证cpu不被100%占用),另一方面我们实现多进程保证并发的执行任务,当然除此之外也可按情况使用线程、协程实现。

运行模式

实现PHP进程前,需了解常见的php的运行模式:

  1. CGI通用网关接口模式
  2. FAST-CGI模式
  3. CLI命令行模式 (php xxx.php)
  4. 模块模式(作为服务器模块)

而php进程则是使用CLI命令行模式运行的

基本实现

PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的,且只能在linux下运行。

$ppid = posix_getpid();// 获取当前进程PID
$pid  = pcntl_fork(); //创建进程switch ($pid){// 创建进程错误case -1:throw new Exception('fork子进程失败!');break;// 子进程workercase 0:$cpid = posix_getpid();cli_set_process_title("我是{$ppid}的子进程,我的进程id是{$cpid}.");sleep(30);exit; // 这里exit掉,避免worker继续执行下面的代码而造成一些问题break;// 主进程masterdefault:cli_set_process_title("我是父进程,我的进程id是{$ppid}.");pcntl_wait($status); // 挂起父进程,等待并返回子进程状态,防止子进程成为僵尸进程break;
}

在命令行php xxx.php运行后,使用ps aux | grep 进程可以看到:

如果没看到,可能是中文乱码了,使用ps aux,查看

或者使用ps –ajft查看层次显示

进程管理-防止进程成为僵尸进程

创建好了进程,那么怎么对子进程进行管理呢?使用信号,对子进程的管理,一般有两种情况:
posix_kill():此函数并不能顾名思义,它通过向子进程发送一个信号来操作子进程,在需要要时可以选择给子进程发送进程终止信号来终止子进程;
pcntl_waitpid():等待或返回fork的子进程状态,如果指定的子进程在此函数调用时已经退出(俗称僵尸进程),此函数将立刻返回,并释放子进程的所有系统资源,此进程可以避免子进程变成僵尸进程,造成系统资源浪费;

孤儿进程:父进程挂了,子进程被pid=1的init进程接管(wait/waitpid),直到子进程自身生命周期结束被系统回收资源和父进程 采取相关的回收操作
僵尸进程:子进程exit退出,父进程没有通过wait/waitpid获取子进程状态,子进程占用的进程号等描述资源符还存在,产生危害:例如进程号是有限的,无法释放进程号导致未来可能无进程号可用

**父进程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成为僵尸进程
作用:使用pcntl_wait()后,在子进程死掉后,父进程也会被停止**

最后我们通过下图(1-1)来简单的总结和描述这个多进程实现的过程:

进程管理-进程间通信

队列:如Redis,推荐
socket:推荐
管道:实现复杂,且管道(pipe),使用文件形式存在,存在硬盘IO性能瓶颈
信号:承载信息量少,不好管理

进程管理-切换为守护进程

使用&实现
php deadloop.php &

实际多进程的使用

一个耗时10S的任务,执行2次,总耗时20S,而开2个进程,只需10S,如下:

job.php:

index.php(进程开启脚本):

echo '开始时间:'.date('H:i:s', time())."\n";$cmds = [['./job.php', 0, 50000],//执行脚本,并传参['./job.php', 50000, 100000]
];
for ($i = 0; $i < 2; $i++){$ppid = posix_getpid();// 获取当前进程PID$pid  = pcntl_fork(); //创建进程switch ($pid){// 创建进程错误case -1:throw new Exception('fork子进程失败!');break;// 子进程workercase 0:$cpid = posix_getpid();cli_set_process_title("我是{$ppid}的子进程,我的进程id是{$cpid}.");// 执行业务脚本pcntl_exec('/usr/local/php/bin/php', $cmds[$i]);exit; // 这里exit掉,避免worker继续执行下面的代码而造成一些问题break;}
}// 等待子进程结束
while (pcntl_waitpid(0, $status) != -1) {$status = pcntl_wexitstatus($status);echo '子进程结束时间:'.date('H:i:s', time())."\n";
}

运行php index.php后:

实例达到理想效果。

PHP 进程的实现与管理相关推荐

  1. 智能手机系统对进程生命周期的管理

    智能机的管理进程跟PC是不一样的,大部分PC爱好者都知道PC的管理进程是PC用户主动管理的 而智能机(Android/iOS/WinPhone)的管理进程是系统层管理进程,在Android2.2版本之 ...

  2. linux系统管理学习笔记之八---进程与作业的管理

    linux系统管理学习笔记之八---进程与作业的管理 2010-01-05 13:00:42 标签:linux 进程 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  3. go linux下进程守护,Linux系统进程管理-Go语言中文社区

    一.进程基础知识 1.1 Linux进程的概念 Process:是运行中的程序的一个副本,是被载入内存的一个指令集合.进程ID(Process ID,PID)号码被用来标记各个进程 UID.GID.和 ...

  4. 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    <实验2 进程控制与通信管理word文档良心出品>由会员分享,可在线阅读,更多相关<实验2 进程控制与通信管理word文档良心出品(13页珍藏版)>请在人人文库网上搜索. 1. ...

  5. C++中的结构体,C管理进程代码,C++管理进程代码,C语言中的联合体

     1.C++中的结构体 #include<iostream> struct lstruct { int num; }; struct MyStruct { int num; doubl ...

  6. linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)

    系统编程: 进程概念->进程控制->基础IO->进程间通信->进程信号->多线程 进程概念 冯诺依曼体系结构----现代计算机硬件体系结构 冯诺依曼体系结构----现代计 ...

  7. 【Linux】Linux进程的创建与管理

    在Linux系统中,除了系统启动之后的第一个进程由系统来创建,其余的进程都必须由已存在的进程来创建,新创建的进程叫做子进程,而创建子进程的进程叫做父进程.那个在系统启动及完成初始化之后,Linux自动 ...

  8. C ——进程内存(内存管理、内存分配(brk,sbrk、mmap、munmap)、内存常见错误)

    内存可以说是C++中很重要很重要的一部分了,我相信这也是C++能够排在编程语言前列的一个原因,因为有了内存管理,使得C++在处理一些底层得程序时,能表现得更加得优秀. 1.进程内存应该分为几部分(内存 ...

  9. arm linux 进程页表,linux内存管理(五)arm页表

    最近比较忙,好多天没更新了,后面可能还需要20多篇文章才能把整个内存管理讲透. 前面讲述了一个通用的页表机制,以及简单介绍了TLB.今天会介绍arm的页表机制,这里特指32位arm. 目前内核提供了一 ...

最新文章

  1. 引用 引用 引用 学会求知 学会共处 学会做人 学会做事
  2. 2d游戏引擎_游戏60秒:RTS游戏从2D到3D的蜕变
  3. P3368 【模板】树状数组 2(区间修改单点查询)
  4. c#通过app.manifest使程序 右键 以管理员身份运行
  5. MOS管的主要参数与重要特性
  6. python计算不规则图形面积_python opencv中的不规则形状检测和测量
  7. 头条终面:写个消息中间件
  8. 配置ganesha-nfs对接rgw
  9. python进阶14文件路径(找不到文件)
  10. Android重力感应示例
  11. 评分9.7! 这本Python神作,火爆编程圈!网友:太香!
  12. pymysql之常见数据库操作
  13. Hadoop1.x HDFS系统架构
  14. 用rsync对网站进行镜像备份(不靠谱)
  15. 作业车间调度问题特征与调度效率相关性的研究Correlation of job-shop scheduling problem features with scheduling efficiency
  16. libsvm 参数以及计算测试点相似度
  17. [BZOJ1045] [HAOI2008] 糖果传递 (中位数)
  18. 【信号与系统|吴大正】1:信号与系统概述
  19. 使用阿里iconfont unicode格式图标
  20. ImageIO 本地读取,网络下载图片

热门文章

  1. MyBatis中动态sql实现时间范围比较的查询
  2. Winform中实现新增和更新共用一个页面的示例流程
  3. Winform中对ZedGraph的曲线标签进行设置,比如去掉标签边框
  4. MySql连接时提示:unknown Mysql server host
  5. 【Paper】Few-Shot Charge Prediction with Discriminative Legal Attributes
  6. Junit4小技巧-测试基类
  7. java比较语句常犯错误和三个数比较大小
  8. opencv 获取一个目录下子目录_OpenCV系列 --- OpenCV4.01配置VS2015
  9. 神策 FM | CEO 荐书—《斯坦福商业决策课》
  10. 26期20180703 正则 grep