fclose():18不是有效的流资源

时间:2012-06-28 15:04:18

标签: php kill-process fclose proc-open

我正在尝试使用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”函数进程总是被调用(这就是我希望它的方式.. .as我需要做更多的处理)。现在,在这种情况下,当我尝试关闭管道时,出现以下错误:

fclose(): 18 is not a valid stream resource 

我尝试使用“ftell”来检查管道是否有效,但这也是错误的。如何检查管道是否已经关闭?

2 个答案:

答案 0 :(得分:13)

在尝试关闭资源之前检查资源是否仍然是资源怎么样:

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

答案 1 :(得分:-1)

或者,如果您的代码工作正常并且只是一个“警告”,请使用@关闭警告。就是这样。

@fclose($pipe);