【问题标题】:Explanation of PHP's fflush() functionPHP的fflush()函数说明
【发布时间】:2016-05-09 15:30:06
【问题描述】:

手册说它将输出刷新到文件中。另外,他们举了一个例子。

$filename = 'bar.txt';

$file = fopen($filename, 'r+');
rewind($file);
fwrite($file, 'Foo');
fflush($file);
ftruncate($file, ftell($file));
fclose($file);

我试图理解它的必要性。我所做的如下:

  • 我创建了一个 bar.txt 文件
  • 我运行了脚本
  • 我打开 bar.txt 并在其中看到“Foo”,然后我再次将文件设为空。
  • 然后...我从脚本中删除了fflush($file); 并再次运行它。
  • 结果完全一样。我又一次把文件清空了。
  • 之后,我将frwite() 行更改为fwrite($file, 'Foo'); die();
  • 再次...同样的结果...一个包含“Foo”的文件。

现在,我看不出使用fflush() 的意义。

在这个例子中我看不出 fflush 的必要性。您能否提供一个真正需要fflush() 的示例。

链接: http://php.net/manual/en/function.fflush.php

【问题讨论】:

  • 如果您的系统在后台进行任何缓存,这可以确保数据实际刷新到磁盘。因为您的代码可以在任何可以运行 PHP 的系统上运行,所以只需使用它即可。
  • @RiggsFolly 我可以知道如何关闭缓存吗?
  • 你可以自己找出来。但关键是是否会在每个可能使用您正在编写的这段代码的系统上关闭缓冲/缓存??

标签: php filesystems


【解决方案1】:

fflush

为了提高效率,当我们调用fwritefputcsv 之类的函数时,PHP 的核心系统库不一定会立即写入文件。它将它们存储在缓冲区中,并在一段时间后同时存储。

例如,假设您有循环,并且在该循环内调用fputcsv 函数,那么PHP 的系统库不一定在每个循环中都将其存储到文件中。

那么使用fflush有什么意义呢?

但是出于日志记录的目的,我们需要确保尽快看到日志,因此最好在每个fwrite 之后使用fflush。除了记录之外,我们不需要强制刷新。让 PHP 内部处理效率。

参考

此函数强制将所有缓冲输出写入文件句柄指向的资源。 fflush PHP Documentaiton

【讨论】:

  • 请注意,fflush() 不保证将数据物理写入底层介质。如果fflush()成功后系统立即崩溃,那么写入的数据仍有可能丢失。为了确保数据持久性,您需要fsync(),但不幸的是——PHP 是 PHP——该函数不存在。
  • @jlh PHP 8.1 将包括 fsyncfdatasync 函数。
【解决方案2】:

fflush() 提供与flush() 相同的必要性,区别在于输出被发送到文件而不是浏览器。

基本上,它所做的是强制立即写入数据,而不是在准备好写入之前将其全部存储在缓冲区中。这在几种情况下很有用,例如 - 使用 linux 命令 tail: https://en.wikipedia.org/wiki/Tail_(Unix) 监控日志。

【讨论】:

  • 感谢您的回答。 PHP 是否具有将字符串写入缓冲区但不立即将其发送到文件的函数?我测试了file_put_contents(),但它确实会立即保存数据。
  • @JulianS 所有正常的文件操作都使用缓冲区,fopen() 之后和fwrite() 之前的所有内容都在该缓冲区中进行。
  • @mister martin: 似乎这是一个缺点,因为它会减慢磁盘写入操作。特别是如果我使用 txt 文件来写入用户数据并且我希望在写入磁盘时使用flock。所以用flock我想尽快完成写操作,而不是阻止其他用户读取文件。
猜你喜欢
  • 2013-12-23
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多