2012-07-18 21 views
0

我用的是以下基本PHP:PHP計數器在文件鎖定後仍然失去命中?

<?php 

    if (file_exists('count_file.txt')) 
    { 
     $fil = fopen('count_file.txt', r); 
     $dat = fread($fil, filesize('count_file.txt')); 
     echo $dat+1; 
     fclose($fil); 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, $dat+1); 
    } 

    else 
    { 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, 1); 
     echo '1'; 
     fclose($fil); 
    } 
?> 

的命中計數器(我寧願沒有之一,但它一直在堅持我們這樣做)。 txt文件保持點擊的計數,它的工作原理...但隨機(有時在幾個星期,有時幾個月後)決定絆倒並從4300下降到11.

我被告知定爲這是使用文件鎖定,所以我改成下面的代碼:

<?php 

     $dat = file_get_contents('count_file.txt'); 
     $fil = fopen('count_file.txt', 'w'); 
     if (flock($fil, LOCK_EX)) { 
      echo $dat+1; 
      fwrite($fil, $dat+1); 
      flock($fil, LOCK_UN); 
     } 
     fclose($fil); 

    ?> 

現在,幾天後它再次從5000到13任何下降有一些想法,爲什麼?

+0

爲什麼不來存儲計數數據庫?如果需要在外部文件中,然後運行一些腳本來獲得點擊次數? – dpitkevics 2012-07-18 08:49:04

+0

我不是PHP精明的,所以不知道如何去存儲它在數據庫中? – John 2012-07-18 08:55:06

回答

1

你fopen()寫文件截斷文件。如果無法獲得鎖,則關閉可能被截斷的文件,然後關閉到零字節。

+0

如果他沒有得到應該通常意味着它被鎖定的鎖。他怎麼能截斷它爲零呢? – worenga 2012-07-18 08:54:47

+0

我認爲這至少可以發生在進程A(持有鎖)寫入文件並且進程B在文件被解鎖並由A關閉之前打開用於寫入的文件。 – mdo 2012-07-18 09:05:27

0

使用的fopen 「A」 代替的fopen 「W」,然後截斷該文件:

<?php 
    $dat = file_get_contents('count_file.txt'); 
    $fil = fopen('count_file.txt', 'a'); 
    if (flock($fil, LOCK_EX)) { 
     ftruncate($fil,0); 
     echo $dat+1; 
     fwrite($fil, $dat+1); 
     flock($fil, LOCK_UN); 
    } 
    fclose($fil); 
?> 
相關問題