如何在PHP中执行后台进程?
什么是后台进程,我们为什么需要它们?
在幕后(即在后台)运行且无需用户干预的进程称为后台进程。调试/错误记录、使用 grafana 或 kibana 监控任何系统、用户通知、调度作业以及发布一些数据都是后台进程的典型示例。后台进程通常是由控制进程创建的用于处理计算任务的子进程。创建后,子进程将自行运行,独立于父进程的状态执行任务。
有很多方法可以在后台运行作业。 Crontab、 Java中的多线程、golang 中的 go 例程都是此类情况的示例。
要在 ubuntu 中运行进程,我们只需在终端上键入命令即可。例如,要运行PHP文件,我们使用以下命令:
php filename.php
在PHP中,即使父作业终止,我们也不能直接在后台运行任何进程作业。在我们了解如何在后台运行进程之前,让我们知道如何从PHP脚本或程序执行终端命令。为了实现这个功能,我们可以在PHP中使用exec和shell_exec函数。
使用PHP运行任何命令的示例命令是:
PHP
/dev/null 2>&1 &', "echo 4"));
?>
PHP
%s 2>&1 & echo $!',
$command,
$outputFile
));
print_r("processID of process in background is: "
. $processId);
}
// "sleep 5" process will run in background
run("sleep 5");
print_r("current processID is: ".getmypid());
?>
上面的代码有几个重点:
- 脚本的输出 (STDOUT) 必须定向到文件。 /dev/null 表示我们没有记录输出。
- 错误 (STDERR) 也必须指向一个文件。 2>&1 表示 STDERR 被重定向到 STDOUT 并因此进入必杀技。
- 最后的 & 告诉命令在后台执行。
我们可以使用命令 ps 检查任何正在运行的进程的状态,例如:
ps -ef
因此,要从PHP运行任何后台进程,我们可以简单地使用 exec 或 shell_exec函数来执行任何终端命令,在该命令中,我们可以简单地在最后添加 & ,以便该进程可以在后台运行。
下面是上述方法的实现:
PHP
%s 2>&1 & echo $!',
$command,
$outputFile
));
print_r("processID of process in background is: "
. $processId);
}
// "sleep 5" process will run in background
run("sleep 5");
print_r("current processID is: ".getmypid());
?>
输出
processID of process in background is: 19926
current processID is: 19924