前言:
此刻姐妹们对“php多进程”大体比较珍视,小伙伴们都想要了解一些“php多进程”的相关内容。那么小编也在网摘上收集了一些关于“php多进程””的相关内容,希望朋友们能喜欢,同学们一起来学习一下吧!1、案例
创建子进程,子进程进入while循环,而父进程打印信息后,终止
1.1、源码
在之前的代码基础上,修改得到如下代码
<?php
$name = 'xiaobei';
$pid = pcntl_fork();
if ($pid<0) {
die("fork is error.");
}
if ($pid===0) {
echo "I am a child.-->",posix_getppid(),'-->',posix_getpid(),'->',$name,PHP_EOL;
exit;
while (1) {
echo time(),PHP_EOL;
sleep(2);
}
}
echo "I am a father-->",posix_getpid(),'-->',$name,PHP_EOL;
1.2、执行结果
截图的关系,程序还是每隔1s,输出当前时间。产生此结果的原因是什么?
1.3、原因说明
由于父进程先于子进程退出。因此子进程就成了孤儿进程。它被linux系统的1号进程收养,从而摆脱当前的运行终端。
那是否可以避免此种情况,或者说,当我们创建子进程后,一定要确保子进程完整退出后,父进程才退出
2、修改案例的源码
2.1、源码
<?php
/**
* Copyright (C) Iamasb
* @project : 3、workerman相关知识点
* @explain : fork子进程
* @filename : fork.php
* @author : iamasb
*/
$name = 'xiaobei';
$pid = pcntl_fork();
if ($pid<0) {
die("fork is error.");
}
if ($pid===0) {
echo "I am a child.-->",posix_getppid(),'-->',posix_getpid(),'->',$name,PHP_EOL;
while (1) {
echo time(),PHP_EOL;
sleep(2);
}
}
echo "I am a father-->",posix_getpid(),'-->',$name,PHP_EOL;
// 非阻塞的运行方式
//while (1) {
// $pid = pcntl_wait($status,WNOHANG); // 非阻塞
// if ($pid>0) {
// echo 'exit->',$pid,'-->',$status,PHP_EOL;
// exit;
// }
//}
$pid = pcntl_wait($status,WUNTRACED); // 阻塞,直到子进程退出时,才返回
echo 'exit->',$pid,'-->',$status,PHP_EOL;
2.2、执行结果
备注: 由于当前输出信息,占据了终端。因此只能另开shell终端,并使用kill命令,杀死子进程
标签: #php多进程