PHP執行個體剖析:計數器

來源:互聯網
上載者:User

 

本款計數器用文本計數,沒有用到資料庫,可以實現如下功能:

利用一個文字檔實現多個頁的計數
減少伺服器的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|

好! 我們來看看PHP檔案

counter.php

<html>
<head>
<title>計數器</title>
<head>
<body>


<?php

/* 定義儲存資料的文字檔 */
$counterFile="counter.dat";

/* 定義一個標記,用來辨別現在需紀錄的資料是否已經文本資料中 */
$sign=False;

/* 將資料以數組的方式讀入變數 $sounterData 備用, */
$counterData=file($counterFile);

/* 用count()Function Compute共有多少個紀錄 */
/* 用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寫成函數,使用上不就方便了.

要想使用require()功能,您必須在php.ini裡做出相應的配置.

不妨參考一下我的配置過程:

(看過我的"成功之路"的朋友要注意了,我對httpd.conf做了小小的修改,希望對照)

httpd.conf 的配置的相關部分是:

ScriptAlias /php4/ "c:/php4/"
Alias /script/ "C:/php4/script/"
這是PHP運行時的目錄的相關配置.

為了不至於搞混,普通的 *.php 檔案,放置在c:\php4\script下
一會兒我們的程式要放置在c:\php4\script\include下.專門放置include檔案的目錄.

那麼,php.ini裡該咋樣配置呢? 這反而簡單:

在PHP.ini裡尋找"include_path",將它改為:

include_path ="C:\php4\script\include" 即可

counter.inc

<?php
function Counter()
{
  $counterFile="c:\\php4\\script\\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]);
       $counterData[$i]=implode("|", $varArray);
       $sign=True; break;
     }
   }
  $data=implode("",$counterData);
  $fp=fopen($counterFile,"w");
  fputs($fp,$data);
  if (!$sign)
   {
    fputs($fp,"\n".$GLOBALS["REQUEST_URI"]."|"."1"."|");
    print("1");
   }
  fclose($fp);
}
?>

將他存放在c:\php4\script\include\下,即:c:\php4\script\include\counter.inc

細心的您肯定發現他們有不同之處:$counterFile="c:\\php4\\script\\counter.dat"

沒錯,為了所有的檔案都放置在一個地方,必須提供絕對路徑. Unix 有所不同喔.

 

好了來看我們怎樣調用它,先看一個例子:

counterTest.php

<?php
require("counter.inc");
?>

<html>
<head>
<title> 網頁計數器 終結版 </title>
</head>
<body>



您是第<? counter();?>位閱讀者



</body>
</html>


您只需在要計數的HTML檔案的檔案頭加入require()函數,引入counter()函數為homepage的一部分.

在需要的地方加入<? counter();?>就可以了.

 



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.