用PHP來寫記數器(詳細介紹)

php(做為現在的主流開發語言)實例剖析:計數器
作者:Sucre_tiger
本款計數器用文本計數,沒有用到數據庫,可以實現如下功能:
利用一個文本文件實現多個頁的計數減少服務器的I/O占用率在需要紀錄的文件裡,隻需加入很少的幾行代碼                                    
基本思路如下:
服務器程序從文本文件中讀取該頁被瀏覽的次數,(因為所有文件向服務器提出請求時,他們的環境變量REQUEST_URI都代表他來自於何處… …,所以,以請求文件的環境變量REQUEST_URI來辨別到底是那一頁正被瀏覽。),將這個次數加一儲存,並在調用這頁的用戶的計算機上顯示出來。
請先看我的數據文本中紀錄的數據樣本,(紅色為瀏覽次數,其前面為相應的被瀏覽的文件)
Counter.dat/script/s2.php(做為現在的主流開發語言)|3|/script/s1.php(做為現在的主流開發語言)|11| /script/counter.php(做為現在的主流開發語言)|5| /testhtml/s2.php(做為現在的主流開發語言)|7|/testhtml/s3.php(做為現在的主流開發語言)|6|
Now,Let’s go!
counter.php(做為現在的主流開發語言)
<html><head>
<title>計數器</title>
<head>  
<body>
<?php(做為現在的主流開發語言)
/* 定義儲存數據的文本文件 */
$counterFile=”counter.dat”;
/* 定義一個標記,用來辨別現在需紀錄的數據是否已經文本數據中 */
$sign=False;
/* 將數據以數組的方式讀入變量 $sounterData 備用, */
$counterData=file($counterFile);  
/* 用count()函數計算共有多少個紀錄 */
/* 用explode()函數把$counterData[$i]按符號”|”分開,並以數組的方式送回到變量$varArray裡 */
/* 函數implode()與explode()剛剛相反,把數組$varArray以符號”|”連接起來送回到$counterData */
/* 還利用瞭環境變量$PATH_INFO
for($i=0;$i<=count($counterData)-1;$i++)  
 {
  $varArray=explode(“|”,$counterData[$i]);  
  if ($varArray[0]==$GLOBALS[“REQUEST_URI”])  
   {
    $varArray[1]++;
    print($varArray[1]);
    $counterData[$i]=implode(“|”, $varArray);
    $sign=True;
    /* 找到本紀錄所在的位置後, 用break 退出循環 */   
    break;
   }  
 }
/* 在這裡,利用implode()這個函數的功能,將數據整理好瞭,一起寫入文本文件中 */
/* 這樣,對服務器的I/O占用就降到瞭最低點
$data=implode(“”,$counterData);
/* 打開文本文件,將數據寫入 */
$fp=fopen($counterFile,”w”);
fputs($fp,$data);  
/* 如果需要紀錄的數據不在文本裡,標志$sign= Flase, 那麼就往文本裡添加數據 */  
if (!$sign) {fputs($fp,”\n”.$GLOBALS[“REQUEST_URI”].”|”.”1″.”|”);
print(“1”);
/* 關閉數據文件 */
fclose($fp);
?>
</body>
</html>  
我們已經看到瞭這段程序的工作過程,也都知道瞭思路,但如果,每個文件裡都這樣寫,豈不是太麻煩.
別慌! 我們還有php(做為現在的主流開發語言)提供的強大的require()功能呢! 我們把counter.php(做為現在的主流開發語言)寫成函數,使用就方便許多瞭。那還等什麼,下面就是你所要的函數:
counter.inc
<?php(做為現在的主流開發語言)  
function Counter()
{
  $counterFile=”/freespace/sucre/public_html/counter.dat”;
  $counterData=file($counterFile);
  $sign=False;
  for($i=0;$i<=count($counterData)-1;$i++)  
   {
    $varArray=explode(“|”,$counterData[$i]);  
    if ($varArray[0]==$GLOBALS[“REQUEST_URI”])  
     {  
       $varArray[1]++;  
       print($varArray[1]);

發佈留言