PHP自体から外部シェルスクリプト(または外部PHPスクリプト)を呼び出して、同じスクリプト内でそのプロセスIDを取得するにはどうすればよいですか?
4 に答える
$command = 'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';
$pid = exec($command, $output);
var_dump($pid);
Unix固有のウィザードではなく、PHPが提供するツールを使用してこれを厳密に実行したい場合は、 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;
クロスプラットフォームソリューションについては、 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の詳細については、ドキュメントを参照してください。
私のために働いたのは、PHPpgrep
で呼び出した後に実行されたコマンド(またはプロセス名)のPIDを取得するために使用することです。exec()
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が返されます。