【问题标题】:how to close php resource in generator functions如何在生成器函数中关闭 php 资源
【发布时间】:2019-05-13 09:32:45
【问题描述】:

当我使用迭代器之后如何关闭资源。

例如 - 如果我有这样的生成器方法:

$fileHandler = fopen($filePath, 'r');

while ($line = fgetcsv($fileHandler)) {
    yield $line;
}

fclose($fileHandler);

如何确保调用“fclose”。

如果我调用生成器并且我只从 csv 获取前 3 行,while 循环将暂停,如果不调用下一个值,则不会调用“fclose”。

如何确保关闭文件处理程序。

【问题讨论】:

  • 你必须检查完成状态吗?
  • 例如有时我需要 3 行。但 csv 可能包含更多。我想知道当我不再需要生成器时是否可以关闭迭代器。否则,如果我只得到 3 行资源可能会导致内存泄漏。

标签: javascript php


【解决方案1】:

把它放在trycatchfinally 块中。 finally 总是会被执行。

$fileHandler = fopen($filePath, 'r');
try {    
    while ($line = fgetcsv($fileHandler)) {
        yield $line;
    }
} catch(Exception $e) {
   //Do something with error.
} finally {
   fclose($fileHandler); 
}

【讨论】:

  • 谢谢,我在 php 文档中找到了类似的解决方案。但我想知道:如果函数暂停(例如,当我得到 3 行时)生成器如何理解它已完成并最终调用?如果生成器暂停,它将如何进行“最终”。也许当垃圾收集器销毁生成器变量时?
【解决方案2】:

最好的办法是这样处理资源

if(is_resource($fileHandler)) fclose($fileHandler);

【讨论】:

  • 这并没有解决实际问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2010-09-28
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多