我有一个网站,在同一时间,可以有多个用户同时写入同一文件。我的代码示例如下。
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?
编辑:
我知道可以通过使用数据库来解决这种不确定性,但是在这种情况下,最好使用纯文本,因此请不要建议我使用数据库。
提前致谢。
最佳答案
对于许多采用多种编程语言的Web应用程序来说,这是一个普遍的理论问题。
答案是肯定的,它可能会引起麻烦。但是,如果要添加到文件中的内容不是很大并且通信量不大,这是一个非常理论上的问题。当今的操作系统和文件系统已经过优化(缓存,延迟写入等),以至在使用完文件句柄后立即关闭它们时,这种情况不太可能发生。
如果遇到错误(在写PHP/捕获其他语言的异常之前检查访问权限),并在一段时间延迟后重试,或者将缓冲区写入临时文件并与另一个进程合并,则可以添加缓冲区之类的内容。您有几种可能。
是的,flock()是一个可以满足这些目的的函数,但是我认为这已经过分设计。
关于php - 多个用户使用PHP一次写入同一文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46016784/