摘要:对编程的理解,应该到深入到操作系统级别。进程控制,我一直都没有接触,感觉好高端,今天啃了一下扩展的最简单的两个函数,有点心得,记录一下吧,欢迎抛砖。
对编程的理解,应该到深入到操作系统级别。进程控制,我一直都没有接触,感觉好高端,今天啃了一下pcntl扩展的最简单的两个函数,有点心得,记录一下吧,欢迎抛砖。
新建代码文件 pcntl_wait.php,如下:
$i = 0; while($i < 2) { $pid = pcntl_fork(); // 父进程和子进程都会执行以下代码 if ($pid == -1) { // 创建子进程错误,返回-1 die("could not fork"); } else if ($pid) { // 父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status); // 父进程必须等待一个子进程退出后,再创建下一个子进程。 $cid = $pid; // 子进程的ID $pid = posix_getpid(); // pid 与mypid一样,是当前进程Id $myid = getmypid(); $ppid = posix_getppid(); // 进程的父级ID $time = microtime(true); echo "I am parent cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; } else { // 子进程得到的$pid 为0,所以这里是子进程的逻辑 $cid = $pid; $pid = posix_getpid(); $ppid = posix_getppid(); $myid = getmypid(); $time = microtime(true); echo "I am child cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; //exit; //sleep(2); } $i++; }
php -f pcntl_wait.php 运行结果如下:
I am child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 I am child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 I am parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 I am parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 I am child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 I am parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302
为何是如上运行过程?
参考了PHP手册和网友blog以上代码能够循环产生子进程,并且父进程会阻塞等待子进程退出,这样就产生了一个问题,父进程必须等待一个子进程退出后,再创建另外一个
个人分析如下:
1.运行shell命令(该进程ID是3471),生成主进程PID为6498
开始循环i=0
6498 此时的父进程 |fork 6499 父进程(6498阻塞),该子进程(6499)执行 ,输出:child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 然后i++ i=1,再次循环
继续循环i=1
6499 此时的父进程 |fork 6500 父进程(6499阻塞),该子进程(6500)执行,输出:child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 然后i++ i=2,本次循环终止,回到其主进程6499 6499 解除阻塞, 此时i=1(因为阻塞时i=1),继续执行 输出:parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 然后i++ i=2,本次循环终止,回到其主进程6498 6498 解除阻塞, 此时i=0(因为阻塞时i=0),继续执行,输出:parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 然后i++ i=1,再次循环
继续循环i=1
6498 此时的父进程 |fork 6501 父进程(6498阻塞),该子进程(6501)执行,输出:child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 然后i++ i=2,本次循环终止,回到其主进程6498 6498 解除阻塞 此时i=1(因为阻塞时为i=1),继续执行,输出:parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302 然后i++ i=2,本次循环终止,回到其主进程3471,最后命令结束。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22661.html
摘要:后面每开启一个子进程,会将子进程的存储到中,用来后面主进程监控子进程,如果子进程意外终止,主进程可以重新佛。将当前子进程设置为会话组再次创建子进程,为了防止在的系统下重新打开控制终端。 wokerman 启动分析 @(学习)[workerman, php] 前期想说的 也是最近才看的代码,遇到不懂得地方就去google,所以这篇文章里面穿插了很多参考资料,可以直接点击阅览。 需要了解一...
摘要:目的综上所述,我的目标就是实现基于模式实现的多进程管理工具。备注下文中,父进程统称为子进程统称为。最后我们通过下图来简单的总结和描述这个多进程实现的过程控制上面实现了多进程和多进程的常驻内存,那如何去管理呢答案多进程通信。 _ | | _ __ __ _ _ __...
摘要:多进程中与多进程相关的两个重要拓展是和。函数执行期间,主进程除了等待无法处理其他任务,所以一般不认为这是多进程编程。回收子进程有两种方式,一种是主进程调用函数等待子进程结束另外一种是处理信号。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 session 数据库操作 加解...
摘要:运行模式实现进程前,需了解常见的的运行模式通用网关接口模式模式命令行模式模块模式作为服务器模块而进程则是使用命令行模式运行的基本实现中提供了一个扩展,可以利用操作系统的调用来实现多进程。 应用场景 一些耗时任务: 大数据表分表后的统计信息功能 分批发送短信或邮件功能 其他可分目标的任务功能(很多种) 所以我们就需要一个常驻内存的任务管理工具,为了保证实时性,一方面我们让它一直执行任...
摘要:运行模式实现进程前,需了解常见的的运行模式通用网关接口模式模式命令行模式模块模式作为服务器模块而进程则是使用命令行模式运行的基本实现中提供了一个扩展,可以利用操作系统的调用来实现多进程。 应用场景 一些耗时任务: 大数据表分表后的统计信息功能 分批发送短信或邮件功能 其他可分目标的任务功能(很多种) 所以我们就需要一个常驻内存的任务管理工具,为了保证实时性,一方面我们让它一直执行任...
阅读 1994·2023-04-25 22:50
阅读 2816·2021-09-29 09:35
阅读 3358·2021-07-29 10:20
阅读 3133·2019-08-29 13:57
阅读 3321·2019-08-29 13:50
阅读 3010·2019-08-26 12:10
阅读 3506·2019-08-23 18:41
阅读 2599·2019-08-23 18:01