基本實作
<?php
$counterFile = "balong.txt";
function displayCounter($file) {
$fp = fopen($file, "r+"); // 讀寫模式開啟
flock($fp, LOCK_EX); // 獨佔鎖定防並發競爭
$num = (int)fgets($fp, 10) + 1; // 讀取並遞增
rewind($fp); // 指標歸零
ftruncate($fp, 0); // 清空檔案
fwrite($fp, $num); // 寫入新值
flock($fp, LOCK_UN); // 釋放鎖
fclose($fp);
echo "您是第 $num 個訪客";
}
if (!file_exists($counterFile)) {
file_put_contents($counterFile, "0");
}
displayCounter($counterFile);
?>
關鍵改進點
- 使用
flock() 檔案鎖解決並發寫入覆蓋問題。
- 採用
r+ 模式單一檔案句柄完成讀寫,避免 exec("rm...") 安全風險。
ftruncate() 確保數字位數變化不殘留舊字元。
進階建議
- 高流量站點改用資料庫
UPDATE counter SET count=count+1 或 Redis INCR 原子操作。
- 加入快取層(APCu/Memcached)減少磁碟 I/O。
- 記錄訪客 IP/UA 進行去重統計(獨立訪客 UV vs 頁面瀏覽 PV)。