【问题标题】:fclose(): 18 is not a valid stream resourcefclose(): 18 不是有效的流资源
【发布时间】:2012-06-30 03:24:54
【问题描述】:

我正在尝试使用 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”来检查管道是否有效,但这也出错了。如何查看管道是否已经关闭??

【问题讨论】:

  • 你为什么要关闭那些管道?它们将在脚本终止时由垃圾收集器自动关闭。
  • @lanzz:我只是想确保这不会造成任何混乱。
  • @Bart: 同意你的看法...之前没注意过这个...现在已经开始这样做了...也会去更新所有其他问题...谢谢!
  • @lanzz 这并不意味着自己清理不是一个好习惯。
  • @lanzz 当然,GC 消除了我们自己进行内存管理等的必要性。这并不妨碍我们通过在这里和那里添加一些定位良好的清理语句来提高性能并减少内存浪费。我已经看到并使用过它(例如,在需要将内存保持在可接受水平的数据库转换脚本中)。在这种情况下,它可能无关紧要,但我必须同意。

标签: php kill-process fclose proc-open


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    @fclose($pipe);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      相关资源
      最近更新 更多