【发布时间】:2021-06-18 18:39:23
【问题描述】:
我有一个小型网页,它根据计数器的 %3(模 3)向用户提供不同的内容。使用 php 从文件中读取计数器,此时计数器会递增并在旧值上写回文件中。 我正在努力使有问题的内容分布均匀,这就是我设置这个的原因。
我担心如果两个用户在相似的时间访问该页面,那么他们可能会得到相同的数据,或者一个可能无法增加计数器,因为另一个当前正在写入文件。
我对 web-dev 还很陌生,所以我不确定如何在没有互斥锁的情况下解决这个问题。我考虑过只打开和关闭一个并在其中执行所有操作,但我试图最大限度地减少用户无法访问文件的时间。 (因此为什么读写是分开打开的)
实现一种互斥的最佳方法是,以便一次只有一个人可以访问该文件,并在多个重叠的文件请求进入时创建一个访问队列以供访问?主要目标是保持向用户显示的内容的比例,这包括保持计数器一致。
代码如下:
<?php
session_start();
$counterName = "<path/to/file>";
$file = fopen($counterName, "r");
$currCount = fread($file, filesize($counterName));
fclose($file);
$newCount = $currCount + 1;
$file = fopen($counterName,'w');
if(fwrite($file, $newCount) === FALSE){
echo "Could not write to the file";
}
fclose($file);
?>
【问题讨论】:
-
您可能会发现flock() 很有用。
-
现在正在阅读,感谢您的建议:)
-
我阅读了一些关于 Flock 的内容,但从用户和稀疏官方文档的混合来看,我发现这听起来在大多数文件系统上相当不可靠,应该尽可能避免使用。 @TangentiallyPerpendicular 我现在正在研究解决方法,但使用它作为关键字肯定会有所帮助,所以谢谢!
标签: php mutex race-condition file-access mutual-exclusion