我正在通过将当前计数存储在文件中来制作一个简单的页面加载计数器。这是我想做到这一点:在保持锁定的情况下读取和写入文件
- 锁定文件(群)
- 读取当前计数(FREAD)
- 加一(++)
- 写入新的计数(FWRITE)
- 解锁文件/关闭它(flock/fclose)
这可以在不失锁的情况下完成吗?
据我所知,该文件不能写入而不失锁。我想出来解决这个问题的唯一方法是用“r +”模式编写一个字符,然后计算字符。
我正在通过将当前计数存储在文件中来制作一个简单的页面加载计数器。这是我想做到这一点:在保持锁定的情况下读取和写入文件
这可以在不失锁的情况下完成吗?
据我所知,该文件不能写入而不失锁。我想出来解决这个问题的唯一方法是用“r +”模式编写一个字符,然后计算字符。
至于说,你可以用蜂拥而至。一个简单的例子是:
//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);
谢谢,ftruncate就是我一直在寻找的东西! – Znarkus 2010-03-15 23:48:08
ftruncate没有像预期的那样工作,但'rewind'做了窍门 – Znarkus 2010-03-18 09:30:35
在我的情况下,我必须在'ftruncate($ handle,0)'之后使用'rewind($ handle)'' – bingjie2680 2013-01-30 15:06:17
我相信你可以使用flock
来达到这个目的。打开一个指向你文件的指针,flock
它,读取数据,写入数据,然后关闭(关闭自动解锁)。
是的,你必须使用倒带前ftruncate
。否则,文件的旧内容只填充零。
工作顺序是:
fopen
flock LOCK_EX
fread filesize
rewind
ftruncate 0
fwrite
flock LOCK_UN
fclose
的1个字符/页面加载可能实际上是相当有趣的:)看着那个文件增长... – Znarkus 2010-03-15 22:20:05