如何从 PHP 本身调用外部 shell 脚本(或外部 PHP 脚本)并在同一脚本中获取其进程 ID?
问问题
23507 次
4 回答
54
$command = 'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';
$pid = exec($command, $output);
var_dump($pid);
于 2009-09-24T12:17:29.423 回答
24
如果您想严格使用 PHP 提供的工具而不是Unix 特定的巫术来执行此操作,您可以使用proc_open
and来执行此操作proc_get_status
,尽管需要将描述符规范传递到proc_open
其中使其使用起来非常冗长:
<?php
$descriptorspec = [
0 => ['pipe', 'r'],
1 => ['pipe', 'w'],
2 => ['pipe', 'w']
];
$proc = proc_open('yourcommand', $descriptorspec, $pipes);
$proc_details = proc_get_status($proc);
$pid = $proc_details['pid'];
echo $pid;
于 2014-09-29T23:28:15.993 回答
3
对于跨平台解决方案,请查看symfony/process。
use Symfony\Component\Process\Process;
$process = new Process('sleep 100');
$process->start();
var_dump($process->getPid());
symfony/process
使用 composer ( )安装后composer require symfony/process
,您可能需要使用 更新自动加载信息,composer dump-autoload
然后使用require __DIR__ . '/vendor/autoload.php';
.
另请注意,您只能获取正在运行的进程的 PID。有关 API 详细信息,请参阅文档。
于 2018-03-05T15:26:47.923 回答
-1
最终为我工作的是pgrep
用来获取调用exec()
PHP后执行的命令(或进程名称)的 PID。
exec($command);
$pid = exec("pgrep $command");
这也适用于启动后台进程。但是,您必须记住将程序的输出通过管道传输到/dev/null
,否则 PHP 将挂起。此外,调用pgrep
时不能包含命令的管道部分:
$command = "bg_process -o someOption";
exec($command + " > /dev/null &"); //Separate the pipe and '&' from the command
$pid = exec("pgrep $command");
请注意,如果系统有多个使用相同命令启动的进程,它将返回与给定的命令匹配的所有进程的 PID pgrep
。如果只传入一个进程名称,它将返回具有该进程名称的所有 PID。
于 2020-11-10T23:01:01.413 回答