1

次のコードを使用して、proc_open でプロセスを開き、ハンドルとパイプをファイルに保存します。

    $command = "COMMAND_TO_EXECUTE";

    $descriptors = array(
        0 => array("pipe", "r"), // stdin is a pipe that the child will read from
        1 => array("pipe", "w"), // stdout is a pipe that the child will write to
        2 => array("file", "error-output.txt", "a")  // stderr is a file to write to
    );


    $pipes = array();

    $processHandle = proc_open($command, $descriptors, $pipes);

    if (is_resource($processHandle)) {     

        $processToSave = array(
            "process" => $processHandle,
            "pipes" => $pipes
        );

        file_put_contents("myfile.bin", serialize($processToSave) );        

    }

次に、このファイル ハンドルをファイルから取得する必要があります。次のコードを使用しました。

$processArray = unserialize(file_get_contents("myfile.bin"));  
$processHandle = $processArray["process"];
$pipes = $processArray["pipes"];

しかし、ファイルから取得した後に $processHandle と $pipes の var_dump を出力すると、リソースまたはプロセスではなく整数が取得されますが、なぜですか??

 var_dump($processHandle) ->  int(0)
 var_dump($pipes) - > array(2) { int(0), int(0) }

もちろん、この時点でパイプを閉じようとすると、エラー、リソースが必要、整数が指定されます。

どうすればこれを機能させることができますか? (注:これは私が探している解決策です)

しかし、別の方法として、プロセスの pid を取得し、この pid を使用してプロセスを停止または強制終了したり、他の処理を行ったりすることもできますが、パイプについてはどうでしょうか。プロセスから/へエラーを読み書きまたは保存するにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

1

私自身の解決策を見つけました。リソースをシリアル化することは不可能であり、スクリプトが完了すると、それらのリソース ハンドラーは解放されました。

解決策は、要求に応じてプロセスを起動および停止するポートでリッスンするデーモンを作成することでした。プロセスは常に実行されているため、ハンドラー プロセスのリストを維持し、要求されたときに停止することができます。

于 2015-07-29T15:22:07.687 に答える