Thi*_*Not 3 php signals exec pcntl
我正在尝试在PHP CLI脚本中调用长时间运行的shell命令exec().但我不能为我的生活弄清楚如何中断PHP脚本并杀死衍生的子进程.好像我打电话exec(),我的信号处理程序被忽略了.以下代码正如我所期望的那样工作; 如果我将SIGTERM发送到进程,它会SIGTERM立即回复并退出.
<?php
declare(ticks = 1);
function sig_handler($signo) {
switch ($signo) {
case SIGTERM:
echo 'SIGTERM' . PHP_EOL;
flush();
break;
default:
}
}
pcntl_signal(SIGTERM, 'sig_handler', false);
sleep(60);
?>
Run Code Online (Sandbox Code Playgroud)
但是,如果我替换sleep(60);为exec('sleep 60');,在睡眠结束之前我不会到达我的信号处理程序.我有两个问题:
exec(或shell_exec或proc_open)?exec?该文件没有说:
如果使用此函数启动程序,为了使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流.如果不这样做将导致PHP挂起,直到程序执行结束.
(强调我的.)我想悬挂也适用于信号处理程序.
为了能够控制子进程,看起来你必须以老式的方式执行它们,使用fork + exec:
switch ($pid = pcntl_fork()) {
case -1: // failed to create process
die('Fork failed');
case 0: // child
pcntl_exec($path,$args);
die('Exec failed');
}
Run Code Online (Sandbox Code Playgroud)
一旦父进程具有子进程ID $pid,它就可以将SIGINT发送给子进程posix_kill($pid, SIGINT).
更新:显然你也可以使用proc_open和proc_terminate.
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |