如何在生成器函数中关闭PHP资源

4
当我使用迭代器时,如何在使用后关闭资源。
例如 - 如果我有这样一个生成器方法:
$fileHandler = fopen($filePath, 'r');

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

fclose($fileHandler);

如何确保“fclose”函数被调用。

如果从csv文件中仅获取了前三行并暂停了while循环,如果不调用下一个值,则“fclose”将不会被调用。

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


你需要检查完成状态吗? - evolutionxbox
例如,有时我需要三行。但是CSV文件可能包含更多内容。我想知道是否可以在不再需要生成器时关闭迭代器。否则,如果我只获取三行,则资源可能会导致内存泄漏。 - user2693928
2
使用try-finally语句块:https://www.php.net/manual/zh/language.generators.overview.php - Ultimater
2个回答

3
将其放在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 行时),生成器如何知道它已经完成并调用 finally 呢?如果生成器被暂停了,它将如何继续执行 'finally' 呢?也许当垃圾收集器销毁生成器变量时? - user2693928

-1

最好的方法是像这样处理资源

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

这并没有解决实际问题。 - donquixote

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接