博客
关于我
php pcntl 多进程学习
阅读量:793 次
发布时间:2023-02-27

本文共 1652 字,大约阅读时间需要 5 分钟。

如何在PHP中捕获子进程退出

在PHP编程中,当父进程需要监控子进程的退出时,可以使用信号处理和进程等待等方式。以下是常用的实现方法

方法一:监听SIGCHLD信号并等待子进程退出

这是一种常见的实现方式,通过注册信号处理函数来捕获子进程退出信号,然后调用pcntl_wait函数来获取子进程的退出状态

代码示例:

declare(ticks=1);
pcntl_signal(SIGCHLD, "sig_handler");
function sig_handler($signo) {
switch ($signo) {
case SIGCHLD:
$status = 0;
$child_id = pcntl_wait($status);
echo sprintf("child exit id: {$child_id} \n");
exit(0);
break;
default:
echo 'uncaugh signal !';
}
}
$pid = pcntl_fork();
if ($pid > 0) {
echo sprintf("fork child id: {$pid} \n");
while (1) {
sleep(1);
}
} else {
echo "child exit \n";
}

方法二:直接调用pcntl_wait函数

当父进程直接调用pcntl_wait函数时,可以立即得到子进程的退出信息

代码示例:

$pid = pcntl_fork();
if ($pid > 0) {
$status = 0;
$child_id = pcntl_wait($status);
echo "child exit id: $child_id \n";
} else {
echo "child exit \n";
}

方法三:使用IO复用监控进程间的管道可读

另一种方法是通过IO复用机制来监控子进程的退出,可以使用pipe管道来实现进程间通信

代码示例:

// 创建一个管道
$pipe = pipe('r');
$pid = pcntl_fork();
if ($pid > 0) {
// 将标准输入重定向到管道
$old_stdin = fopen(stdin, 'r');
fclose(stdin);
stdin = fopen($pipe[0], 'r');
// 进行IO复用
while (1) {
$read = fread(stdin, 1024);
if ($read === false) {
echo "child exit \n";
break;
}
}
fclose(stdin);
} else {
// 将输出写入管道
$old_stdout = fopen(stdout, 'w');
fclose(stdout);
stdout = fopen($pipe[1], 'w');
// 等待父进程的写入
while (1) {
$read = fread(stdin, 1024);
if ($read === false) {
exit(0);
}
}
fclose(stdout);
}

这三种方法都可以用来捕获子进程退出,选择哪一种取决于具体的应用场景和需求

转载地址:http://drvfk.baihongyu.com/

你可能感兴趣的文章
phoenix无法连接hbase shell创建表失败_报错_PleaseHoldException: Master is initializing---记录020_大数据工作笔记0180
查看>>
Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
查看>>
phoenix连接hbase报错Can not resolve hadoop120, please check your network_记录026---大数据工作笔记0187
查看>>
Photoshop工作笔记001---Photoshop常用快捷键总结
查看>>
Reids配置文件redis.conf中文详解
查看>>
Photoshop脚本入门
查看>>
PHP
查看>>
Regular Expression Notes
查看>>
PHP $FILES error码对应错误信息
查看>>
PHP $_FILES函数详解
查看>>
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
查看>>
php & 和 & (主要是url 问题)
查看>>
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
查看>>
php -- 魔术方法 之 获取属性:__get()
查看>>
php -树-二叉树的实现
查看>>
PHP -算法-二路归并
查看>>
php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
查看>>
php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
查看>>
regExp的match、exec、test区别
查看>>
php 404 自定义,APACHE 自定义404错误页面设置方法
查看>>