7

proc_openを使用してプロセスを実行しようとしています。プロセスのI/Oはパイプで処理されます!!

$descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "w")
);

たまたま、開いた「cプログラム」が動かなくなってしまうことがあり、プロセスを強制的にシャットダウンするmax_time_limitチェックを追加しました。コールバック関数(つまり、onExit)を追加して(「call_user_function」を使用)、「プロセスが終了する」たびに有効な方法で、または強制的に情報を処理します。

「終了」機能で、I/Oパイプを閉じています

 foreach ($pipes as $pipe) {
    fclose($pipe);
 }

プロセスに有効な終了があった場合、上記は完全に正常に機能します。ただし、プロセスを強制的に強制終了した場合は、proc_terminateを呼び出して強制終了しました。プロセスの終了も先に進んでI/Oパイプを閉じることを理解していますが、問題は、コールバックのために、「onExit」関数プロセスが常に呼び出されることです(これが私が望む方法です。 。さらに処理を行う必要があるため)。さて、この場合、パイプを閉じようとすると、次のエラーが発生します。

fclose(): 18 is not a valid stream resource 

「ftell」を使用してパイプが有効かどうかを確認しようとしましたが、それもエラーになりました。パイプがすでに閉じられているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

15

リソースを閉じようとする前に、リソースがまだリソースであるかどうかを確認してください。

foreach ($pipes as $pipe) {
  // Finds whether a variable is a resource
  if(is_resource($pipe)) {
    fclose($pipe);
  }
}
于 2012-06-28T15:07:01.250 に答える
-1

または、コードが正常に機能していて、それが単なる「警告」である場合は、警告を で閉じ@ます。それで全部です。

@fclose($pipe);
于 2016-03-19T18:50:41.687 に答える