29

PHP自体から外部シェルスクリプト(または外部PHPスクリプト)を呼び出して、同じスクリプト内でそのプロセスIDを取得するにはどうすればよいですか?

4

4 に答える 4

54
$command =  'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';

$pid = exec($command, $output);

var_dump($pid);
于 2009-09-24T12:17:29.423 に答える
24

Unix固有のウィザードではなく、PHPが提供するツールを使用してこれを厳密に実行したい場合は、 proc_openandを使用して実行できますが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/processcomposer( )を使用してインストールした後composer require symfony/process、で自動読み込み情報を更新してからcomposer dump-autoload、で自動読み込みを要求する必要がある場合がありますrequire __DIR__ . '/vendor/autoload.php';

実行中のプロセスのPIDのみを取得できることにも注意してください。APIの詳細については、ドキュメントを参照してください。

于 2018-03-05T15:26:47.923 に答える
-1

私のために働いたのは、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が返されます。

于 2020-11-10T23:01:01.413 に答える