PHP - fwrite()会立即保存文件吗?

11

这是我的代码:

$zplHandle = fopen($target_file,'w');
fwrite($zplHandle, $zplBlock01);
fwrite($zplHandle, $zplBlock02);
fwrite($zplHandle, $zplBlock03);
fclose($zplHandle);

文件会在何时保存?是在写入后立即保存还是在关闭后保存?

我问这个问题是因为我正在使用Printfil监听文件夹中的文件,并打印任何新创建的文件。如果PHP在fwrite后立即提交保存,我可能会遇到Printfil无法捕获随后的写入的问题。

感谢您的帮助。

4个回答

12

PHP 可能会立即写入内容,也可能不会。它之间有一个缓存层。您可以使用 fflush() 强制写入,但除非您只使用一个 fwrite(),否则无法强制等待。


1
True;另一方面,当您调用fclose()时,它肯定会写入内容(并释放文件锁)。 - Piskvor left the building
@Piskvor:文件夹监控软件何时能识别新创建的文件?是在保存后还是在锁定释放后?这非常关键,因为有大约8000个文本块要写入文件,监控程序不应在其中任何位置触发。感谢您的建议。 - Nirmal
我不知道,问PrintFil的人。 - Sjoerd
1
@Sjoerd 有没有办法打开或关闭缓存?如果有,怎么做? - Julian
2
@Julian,不,不能用fwrite。如果你想对写入操作有更多的控制,可以使用direct I/O模块。 - Sjoerd
显示剩余2条评论

5

我写了一小段代码进行测试,似乎在fwrite之后,新内容会立即被检测到,而不是在fclose之后。

以下是我在Linux上的测试结果。

#!/usr/bin/env php
<?php
$f = fopen("file.txt","a+");
for($i=0;$i<10;$i++)
{
    sleep(1);
    fwrite($f,"something\n");
    echo $i," write ...\n";
}
fclose($f);
echo "stop write";
?>

运行PHP脚本后,我使用tail -f file.txt检测新内容。它会同时显示与PHP输出标签相同的新内容。


好的。至少这给了一些在预定时间之前刷新的可能性的想法。我将根据您的测试结果进行工作。谢谢Spawn! - Nirmal
我觉得这个答案有点误导人,因为在繁忙的系统中或者其他因素影响下,写入时间会有所不同。但是使用@Sjoerd的答案,你可以使用fflush()来保证写入时间。 - Spencer O'Reilly

4

文件将在fclose时保存。如果您想在此之前将内容放入文件中,请使用fflush()


1

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