我有一个网站,在同一时刻,可能有多个用户同时写入同一个文件.我的代码示例如下.
PHP 5.6.20
<?php
$root=realpath($_SERVER["DOCUMENT_ROOT"]);
$var=time()."|";
echo $var."<br/>";
$filename=$root."/Testing/Testing/test1.txt";
$myfile=fopen($filename,"a");
fwrite($myfile,$var);
fclose($myfile);
$myfile=fopen($filename,"r");
$contents = fread($myfile, filesize($filename));
echo $contents;
fclose($myfile);
?>
我在PHP中读到,如果多个用户试图在同一个文件中写入同一个文件,那么数据就有可能被破坏,我当然不希望有一个代码可能导致长期运行中的某些数据损坏.
我试图在我的浏览器上几乎同时运行上面的代码来模拟同时写入同一文件的多个用户,并且它没有产生任何错误或任何数据损坏写入的文件,但我是仍然不确定未来的数据损坏.
我读到我可以使用flock来确保2个用户不能同时写入该文件,但是由于我测试了上面的代码并且它没有产生数据损坏,我不确定是否应该更新我的代码羊群或只是保持原样.
我的问题是:
1)上述代码是否有可能破坏其写入的文件?
2)如果是,使用flock会解决这个问题吗?如果是的话,我应该如何在上面的代码中实现flock?
编辑:
我知道这种不确定性可以通过使用数据库来解决,但对于这种情况,最好使用纯文本,所以请不要建议我使用数据库.
提前致谢.
解决方法:
这是许多编程语言中许多Web应用程序的常见理论问题.
答案是肯定的,它可能会带来麻烦.但是,如果您要添加到文件中的内容不是很大并且没有大量流量,这是一个非常理论上的问题.今天的操作系统和文件系统已经过如此优化(缓存,懒惰写入等),当您在使用它们后立即关闭文件句柄时,它不太可能发生.
你可以添加类似缓冲区的东西,如果遇到错误(在用其他语言编写PHP / catch异常之前检查访问权限)并在延迟一段时间后重试或将缓冲区写入临时文件并将其与另一个进程合并 – 你有几种可能性.
是的,flock()是一个可以用于这些目的的功能,但我认为,这已经过度设计了.