检查 fclose() 的返回值是一件好事,因为一些操作系统只在关闭时刷新文件输出,因此可能会从 fclose() 返回错误。通过这样做,你可以捕获严重的数据丢失错误。
我从惨痛的教训中吸取了这个教训。
(PHP 4, PHP 5, PHP 7, PHP 8)
fclose — 关闭打开的文件指针
示例 #1 一个简单的 fclose() 示例
<?php
$handle = fopen('somefile.txt', 'r');
fclose($handle);
?>
检查 fclose() 的返回值是一件好事,因为一些操作系统只在关闭时刷新文件输出,因此可能会从 fclose() 返回错误。通过这样做,你可以捕获严重的数据丢失错误。
我从惨痛的教训中吸取了这个教训。
通常,在完成文件操作后关闭文件始终是一个好主意。如果发生错误,并且文件没有正确关闭,很容易导致文件损坏。如果你担心效率,开销可以忽略不计。
如果你在使用 stream_socket_server / stream_select 打开的一些客户端流无法正确断开连接时遇到问题,你应该尝试使用 stream_socket_shutdown。
<?php stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR); ?>
如果你想通过一些函数串联一个文件句柄,并且每个函数都允许关闭文件,你可能应该先在下一个函数中查看该句柄是否仍然有效。
打开文件,通常会使用以下代码
if (!$fh = fopen($filename, $mode)) return false;
但是,如果你可能已经关闭了文件,并且你想检查这一点,类似的语句将不起作用。
不起作用:if (!$fh) end_of_chain();
使用更优:if (is_resource($fh)) end_of_chain();
确保你使用 fread() 或等效方法清除传入缓冲区中的所有传入数据包非常重要。虽然你可以调用 fclose(),但套接字实际上不会关闭,直到传入数据包被清除。这会导致一些混乱。
回应下面 kumar mcmillan 的“gotcha”说明,我们在 W2K 机器上得到了不同的结果
<?php
$file_pointer = fopen('textfile.dat', 'r');
fclose($file_pointer);
echo '$file_pointer is resource = ' . (is_resource($file_pointer) ? 'true': 'false');
?>
输出
$file_pointer is resource = false