有没有办法关闭程序中打开的所有文件,而不需要对每个文件单独使用 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);
get_resources()
是 PHP7 中的一个函数,它返回所有当前活动资源的数组。
对于所有打开文件的数组,请将其与过滤器“stream”一起使用 -
get_resources('stream')
使用函数映射返回的数组
fclose()
array_map('fclose', get_resources('stream'))
这将关闭所有打开的文件。
如果您从网络浏览器运行 PHP,上面使用
get_resources()
的答案可以与 array_map()
一起正常工作。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 上进行测试和使用。