在php中一次性关闭所有打开的文件

问题描述 投票:0回答:2

有没有办法关闭程序中打开的所有文件,而不需要对每个文件单独使用 fclose() ?

类似这样的-

$txt_template1 = fopen("1.txt", "r") or die("Unable to open file!");
$txt_template2 = fopen("2.txt", "r") or die("Unable to open file!");
$txt_template3 = fopen("3.txt", "r") or die("Unable to open file!");
$txt_template4 = fopen("4.txt", "r") or die("Unable to open file!");
$txt_template5 = fopen("5.txt", "r") or die("Unable to open file!");
$txt_template6 = fopen("6.txt", "r") or die("Unable to open file!");

fclose(ALL_OPEN_FILES);
php file-handling fclose
2个回答
4
投票

get_resources()
是 PHP7 中的一个函数,它返回所有当前活动资源的数组。

对于所有打开文件的数组,请将其与过滤器“stream”一起使用 -

get_resources('stream')

使用函数映射返回的数组

fclose()

array_map('fclose', get_resources('stream'))

这将关闭所有打开的文件。


0
投票

如果您从网络浏览器运行 PHP,上面使用

get_resources()
的答案可以与
array_map()
一起正常工作。
但如果您从 CLI 运行 PHP,则始终至少有 3 个流资源。一个是
php://stdin
,两个是
php://stdout
,三个是
php://stderr

因此,将

array_map()
fclose()
一起使用将在资源号 2 (
php://stdout
) 处为空,并且不会出现任何错误消息。

要确保它仅关闭文件句柄,请使用

stream_get_meta_data()
进行检查。 (请参阅参考资料此处。)

$fh = fopen('test.txt', 'w');// for test open but not closed file handle.
$resources = get_resources();
foreach ($resources as $rs) {
    $resourceType = get_resource_type($rs);
    if ('stream' === strtolower($resourceType)) {
        $streamMeta = stream_get_meta_data($rs);
        if (isset($streamMeta['wrapper_type']) && 'plainfile' === strtolower($streamMeta['wrapper_type'])) {
            fclose($rs);
        }
    }
    unset($resourceType, $streamMeta);
}
unset($rs, $resources);

echo 'ok' . "\n";

已在 PHP 7.0+(包括 8.4)和 Web 服务器、CLI 上进行测试和使用。

© www.soinside.com 2019 - 2024. All rights reserved.