2013-05-11 80 views
1

我有一個計數器問題。我需要計算兩個變量,用|分隔,但有時計數器不會增加變量的值。帶羊羣的PHP計數器

numeri.txt(計數器):

6122|742610 

這是PHP腳本:

$filename="numeri.txt"; 
while(!$fp=fopen($filename,'c+')) 
{ 
    usleep(100000); 
} 
while(!flock($fp,LOCK_EX)) 
{ 
    usleep(100000); 
} 
$contents=fread($fp,filesize($filename)); 
ftruncate($fp,0); 
rewind($fp); 
$contents=explode("|",$contents); 
$clicks=$contents[0]; 
$impressions=$contents[1]+1; 
fwrite($fp,$clicks."|".$impressions); 
flock($fp,LOCK_UN); 
fclose($fp); 

我還有一個計數器,它是慢了很多,但數兩個值(點擊和展示)究竟。有時,計數器numeri.txt會比另一個計數器計入更多的展示次數。爲什麼?我怎樣才能解決這個問題?

+1

檢查是否第二,while循環運行到max_execution超時時間,我認爲sime類型的死鎖/飢餓情況。 – worenga 2013-05-11 09:08:33

+0

當你說「有時候」時 - 你的意思是說某個時候功能增加了,有時卻沒有?或者你的意思是說每行都不會影響一些行嗎? – bestprogrammerintheworld 2013-05-11 09:13:10

+0

我的意思是功能增加了,但是比它應該增加 – Megadv 2013-05-11 09:14:36

回答

0

嘗試在解鎖前執行刷新。在數據甚至可能被寫入之前,你正在解鎖,允許另一次執行破壞。

http://php.net/manual/en/function.fflush.php

+0

我在'fwrite'和'flock($ fp,LOCK_UN)之間添加了'fflush($ fp);'但它仍然沒有工作......它更多地計數1值 – Megadv 2013-05-15 11:48:08

+0

你是什麼意思「計數更多1值」。 – 2013-05-21 21:40:17

0

我們正在利用我們的高流量的網站下面的計算曝光:

<?php 

    $countfile = "counter.txt"; // SET THIS 

    $yearmonthday = date("Y.m.d"); 
    $yearmonth = date("Y.m");; 

    // Read the current counts 
    $countFileHandler = fopen($countfile, "r+"); 
    if (!$countFileHandler) { 
     die("Can't open count file"); 
    } 

    if (flock($countFileHandler, LOCK_EX)) { 
     while (($line = fgets($countFileHandler)) !== false) { 
      list($date, $count) = explode(":", trim($line)); 
      $counts[$date] = $count; 
     } 

     $counts[$yearmonthday]++; 
     $counts[$yearmonth]++; 

     fseek($countFileHandler, 0); 

     // Write the counts back to the file 
     krsort($counts); 
     foreach ($counts as $date => $count) { 
      fwrite($countFileHandler, "$date:$count\n"); 
      fflush($countFileHandler); 
     } 

     flock($countFileHandler, LOCK_UN); 
    } else { 
     echo "Couldn't acquire file lock!"; 
    } 

    fclose($countFileHandler); 
} 
?> 

結果均爲每日和每月彙總:

2015.10.02:40513 
2015.10.01:48396 
2015.10:88909