fclose(): 18 is not a valid stream resource

Kapil Kaushik picture Kapil Kaushik · Jun 28, 2012 · Viewed 13.7k times · Source

I am trying to execute a process using proc_open. The I/O for the process is handled by the pipes !!

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

Now, as it happens, sometimes the "c program" that I have opened does get stuck, and I have added a max_time_limit check which would forcibly shut down the process. I have added callback function -- namely onExit -- (using "call_user_function") to process the information whenever the "process exits" in a valid manner or by force.

In the "exit" function, I am closing the i/o pipes

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

The above works perfectly fine if the process has had a valid exit. However, in the case when I forcibly killed my process, I called proc_terminate to do so. I understand that the termination of process would also go ahead and close any I/O pipes, but the problem is that due to callback, my "onExit" function process always gets called (and this is the way I want it to be...as I need to do some more processing). Now, in this case, as I try to close the pipes, I get the following error:

fclose(): 18 is not a valid stream resource 

I tried using "ftell" to check whether the pipe is valid or not, but that too errored out. How do I check whether the pipes have already been closed or not??

Answer

Bart picture Bart · Jun 28, 2012

What about checking if the resource is still a resource before trying to close it:

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