現在の位置: ホーム> 最新記事一覧> proc_terminateを使用してstream_get_contentsと協力して、子プロセス出力を取得する方法は?

proc_terminateを使用してstream_get_contentsと協力して、子プロセス出力を取得する方法は?

gitbox 2025-06-09

1。proc_openとは何ですか?

Proc_openは、PHPの関数であり、プロセスを開始して対話できます。これにより、子プロセスの出力を読み取り、入力を書き込み、プロセスのエラー出力を取得できます。 execshell_execとは異なり、 proc_openはより強力な制御機能を提供できます。

2。Proc_openを使用して子プロセスを開始する方法は?

まず、 Proc_openを使用して子プロセスを開始する必要があります。 PROC_OPENの最初のパラメーターはコマンド文字列、2番目のパラメーターはパイプライン構成、3番目のパラメーターは子プロセスの出力とエラーを受信するために使用される配列です。

簡単な例を次に示します。

 $cmd = "ls -l";  // 任意のコマンドに置き換えることができます
$descriptorspec = [
    1 => ['pipe', 'w'],  // 標準出力
    2 => ['pipe', 'w'],  // 標準誤差
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 子プロセスの出力をお読みください
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取標準誤差(ある場合)
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // プロセスを閉じます
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }
    echo "Exit Code: " . $exit_code . "\n";
}

この例では、 LS -Lコマンドを開始し、 Stream_Get_Contentsを使用して標準の出力と標準エラーを読み取ります。 proc_openを使用すると、実行中にプロセスと対話できますが、 stream_get_contentsは出力ストリームで内容を取得するために使用できます。


3. proc_terminateを使用して、子プロセスを終了します

場合によっては、特に子どものプロセスが長すぎる、または行き詰まっている場合、子どものプロセスを強制的に終わらせてもらう必要がある場合があります。 Proc_terminate関数を使用して、実行中の子プロセスを終了できます。

proc_terminateを使用してプロセスを終了する例は次のとおりです。

 $cmd = "sleep 10";  // プロセスを眠らせます102番,長期にわたるプロセスをシミュレートする
$descriptorspec = [
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 等待几2番钟后终止子进程
    sleep(3);
    proc_terminate($process);  // プロセスの強制終了

    // 出力とエラーを読み取ります
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    echo "Output after termination:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    // プロセス終了コードを取得します
    $exit_code = proc_close($process);
    echo "Exit Code: " . $exit_code . "\n";
}

この例では、 Sleep 10を使用して長い実行プロセスをシミュレートし、3秒後にPROC_ TERMINETEでプロセスを終了しました。プロセスを終了した後、子プロセスの出力とエラー情報を取得できることに注意してください。


4.包括的な例:子プロセスの出力とエラーを同時に取得し、プロセスを制御する方法は?

以前のコンテンツを組み合わせて、プロセスの開始、出力を取得、エラー出力、必要に応じてプロセスを終了する方法を示す完全な例を以下に示します。

 $cmd = "ping -c 4 google.com";  // テストのコマンド,ping Google
$descriptorspec = [
    1 => ['pipe', 'w'],  // 標準出力
    2 => ['pipe', 'w'],  // 標準誤差
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // プロセスの出力をお読みください
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取標準誤差输出
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // プロセスを閉じます并获取退出代码
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    echo "Exit Code: " . $exit_code . "\n";
}

この例では、 Pingコマンドを使用してネットワーク接続をテストし、 Proc_Openを介してプロセスを開始して出力とエラー情報を読み取ります。