我正在制作一个简单的页面加载计数器,通过将当前计数存储在文件中来实现。这是我想要做的:
- 锁定文件(flock)
- 读取当前计数(fread)
- 增加计数(++)
- 写入新计数(fwrite)
- 解锁文件/关闭文件(flock/fclose)
是否可以在不失去锁定的情况下完成此操作?
据我所知,如果没有失去锁定,文件是无法被写入的。为了解决这个问题,我想到的唯一方法是使用“r+”模式写入一个字符,然后计算字符数量。
如前所述,您可以使用FLock。以下是一个简单示例:
//Open the File Stream
$handle = fopen("file.txt","r+");
//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
$count = fread($handle, filesize("file.txt")); //Get Current Hit Count
$count = $count + 1; //Increment Hit Count by 1
ftruncate($handle, 0); //Truncate the file to 0
rewind($handle); //Set write pointer to beginning of file
fwrite($handle, $count); //Write the new Hit Count
flock($handle, LOCK_UN); //Unlock File
} else {
echo "Could not Lock File!";
}
//Close Stream
fclose($handle);
rewind
解决了问题。 - Markus Hedlundftruncate($handle, 0)
之后使用 rewind($handle)
。 - bingjie2680是的,在使用ftruncate
之前必须使用rewind。否则,文件的旧内容仅被重新填充为零。
工作顺序如下:
fopen
flock LOCK_EX
fread filesize
rewind
ftruncate 0
fwrite
flock LOCK_UN
fclose