2010-03-15 83 views
8

我正在通过将当前计数存储在文件中来制作一个简单的页面加载计数器。这是我想做到这一点:在保持锁定的情况下读取和写入文件

  1. 锁定文件(群)
  2. 读取当前计数(FREAD)
  3. 加一(++)
  4. 写入新的计数(FWRITE)
  5. 解锁文件/关闭它(flock/fclose)

这可以在不失锁的情况下完成吗?

据我所知,该文件不能写入而不失锁。我想出来解决这个问题的唯一方法是用“r +”模式编写一个字符,然后计算字符。

+0

的1个字符/页面加载可能实际上是相当有趣的:)看着那个文件增长... – Znarkus 2010-03-15 22:20:05

回答

19

至于说,你可以用蜂拥而至。一个简单的例子是:

//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); 
+1

谢谢,ftruncate就是我一直在寻找的东西! – Znarkus 2010-03-15 23:48:08

+1

ftruncate没有像预期的那样工作,但'rewind'做了窍门 – Znarkus 2010-03-18 09:30:35

+3

在我的情况下,我必须在'ftruncate($ handle,0)'之后使用'rewind($ handle)'' – bingjie2680 2013-01-30 15:06:17

3

我相信你可以使用flock来达到这个目的。打开一个指向你文件的指针,flock它,读取数据,写入数据,然后关闭(关闭自动解锁)。

http://php.net/flock

+0

是的,我知道的羊群,但不知道如何保持锁定时我写。 – Znarkus 2010-03-15 22:42:47

+0

锁定一直保持到您解锁,关闭文件或脚本终止。 – 2010-03-15 23:04:00

+1

不会自动解锁,因为5.3.2 – Tertium 2015-05-15 08:14:52

1

是的,你必须使用倒带前ftruncate。否则,文件的旧内容只填充零。

工作顺序是:

fopen 
    flock LOCK_EX 
    fread filesize 
    rewind 
    ftruncate 0 
    fwrite 
    flock LOCK_UN 
    fclose 
相关问题