本計數器採用文字檔儲存,無需資料庫,可實現以下功能:
伺服器程式從文字檔讀取該頁瀏覽次數(利用環境變數 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
/* 定義儲存資料的文字檔 */
$counterFile = "counter.dat";
/* 定義標記,辨別目前需記錄的資料是否已存在 */
$sign = false;
/* 以陣列方式讀入資料備用 */
$counterData = file($counterFile);
/* 遍歷每一筆記錄 */
for ($i = 0; $i <= count($counterData) - 1; $i++) {
/* 以 "|" 分割每行資料 */
$varArray = explode("|", $counterData[$i]);
/* 比對 REQUEST_URI */
if ($varArray[0] == $GLOBALS["REQUEST_URI"]) {
$varArray[1]++; // 次數加一
print($varArray[1]); // 輸出次數
$counterData[$i] = implode("|", $varArray); // 重組資料
$sign = true; // 找到記錄
break; // 跳出迴圈
}
}
/* 將整理後的資料一次寫入檔案,將 I/O 降至最低 */
$data = implode("", $counterData);
$fp = fopen($counterFile, "w");
fputs($fp, $data);
/* 若資料不存在於檔案中(新頁面),則新增記錄 */
if (!$sign) {
fputs($fp, "\n" . $GLOBALS["REQUEST_URI"] . "|" . "1" . "|");
print("1");
}
fclose($fp);
?>
為了方便重複使用,將計數器封裝成函數:
<?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]);
$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);
}
?>
<?php
require("counter.inc");
?>
<html>
<head>
<title> 網頁計數器 終結版 </title>
</head>
<body>
您是第<? Counter(); ?>位閱讀者
</body>
</html>
只需在欲計數的 HTML 檔案開頭加入 require(),在需要顯示處呼叫 <? Counter(); ?> 即可。
666;若檔案在子目錄,該目錄也需有寫入權限。counter.inc 和 counter.dat 放在子目錄 include,其他目錄用 require("../include/counter.inc") 調用時可能出現「權限不足」錯誤。解決方案:確保 Web 伺服器進程對整個路徑有讀寫權限,或使用絕對路徑。flock() 檔案鎖定防止並發寫入衝突這個文字檔計數器方案無需資料庫,部署簡單,透過函數封裝實現模組化複用,適合中小型網站快速部署頁面計數功能。核心在於利用 REQUEST_URI 做為唯一鍵值,配合一次性讀寫最小化 I/O 開銷。