2012-06-28 21 views
5

proc_openを使用してプロセスを実行しようとしています。プロセスのI/Oはパイプによって処理されます!今fclose():18は有効なストリームリソースではありません

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

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

は、Iは、I/Oパイプ

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

完全に罰金以上の作品を閉じています。しかし、強制的に私のプロセスを殺した場合、私はproc_terminateを呼び出してそうしました。私はプロセスの終了も先に進んでI/Oパイプを閉じることを理解していますが、問題はコールバックにより、私の "onExit"関数プロセスが常に呼び出されることです(これが私の方法です。 。私はもう少し処理する必要があります)。私はパイプを閉じようとして今、この場合には、私は次のエラーを取得する:

fclose(): 18 is not a valid stream resource 

私はパイプが有効であるかどうか、それはあまりにもアウトエラーが発生したかどうかを確認するために「ftellは」使ってみました。パイプが既に閉じられているかどうかを確認するにはどうすればいいですか?

+0

なぜこれらのパイプを閉じますか?それらは、スクリプトの終了時にガベージコレクタによって自動的に閉じられます。 – lanzz

+0

@lanzz:これで混乱が起きないことを確認したかっただけです。 –

+0

@Bart:あなたに同意する...これに注意を払っていなかった....今やろうとしている....他の質問も更新する...ありがとう! –

答えて

12

何リソースがまだそれを閉じようとする前に、リソースであるかどうかのチェックについて:

foreach ($pipes as $pipe) { 
    // Finds whether a variable is a resource 
    if(is_resource($pipe)) { 
    fclose($pipe); 
    } 
} 
+0

はい本当に......それは....ありがとうトン! –

-1

またはあなたのコードが正常に動作しているとそれだけで「警告」だならば、@で警告を閉じます。それで全部です。

@fclose($pipe); 
関連する問題