免費虛擬主機常不提供 MySQL、或限制極嚴。利用 PHP 強大的檔案處理能力,以結構化文字檔案模擬資料表操作,可支援留言板、聊天室、書籤等中小型應用。
index.database每行一筆記錄,欄位以 || 分隔(便於 explode() 解析):
留言人姓名||留言人性別||留言時間||留言內容儲存路徑||feiyn
feiyn 為固定尾碼,防止 fgets() 讀取時受換行符干擾。<?php
// 必要參數:$name, $sex, $time, $savePosite
$indexFile = 'index.database';
$lockFile = $indexFile . 'Lock';
// 組裝記錄
$message = "$name||$sex||$time||$savePosite||feiyn||";
// 簡易檔案鎖:輪詢等待釋放
while (file_exists($lockFile)) { $temp++; }
fclose(fopen($lockFile, 'w')); // 建立鎖檔
$fp = fopen($indexFile, 'a'); // 附加模式
fputs($fp, $message);
fclose($fp);
unlink($lockFile); // 釋放鎖
?>
<?php
$indexFile = 'index.database';
$lockFile = $indexFile . 'Lock';
while (file_exists($lockFile)) { $temp++; }
fclose(fopen($lockFile, 'w'));
$ary = file($indexFile); // 整檔讀入陣列,每行一元素
unlink($lockFile);
for ($i = 0; $i < count($ary); $i++) {
$tempAry = explode('||', $ary[$i]);
echo "name: {$tempAry[0]}
";
echo "sex: {$tempAry[1]}
";
echo "time: {$tempAry[2]}
";
echo "savePosite: {$tempAry[3]}
"; // 可由此路徑讀取完整內容
}
?>
| 技術 | 實作方式 | 備註 |
|---|---|---|
| 欄位分隔 | || + explode() | 避開常見標點,降低衝突機率 |
| 逐行讀取 | file() 或 fgets() | file() 適合小檔案,大檔案請用 fgets() 串流 |
| 併發控制 | 鎖檔 .Lock + while(file_exists) 忙等待 | 簡易自旋鎖,高併發下 CPU 佔用高,建議改用 flock() |
| 索引概念 | 主索引檔 + 內容分離儲存 | 類似資料庫的聚集索引+溢位頁思想 |
flock() 替代鎖檔:flock($fp, LOCK_EX) 為阻塞式鎖,避免忙等待浪費 CPU。json_decode(file_get_contents()) 即可取得關聯陣列,省去手動分割。APCu、Redis 快取熱門查詢。new PDO('sqlite:data.db') 獲得完整 SQL 功能,零配置、單檔案、支援索引/事務。檔案型儲存是「無資料庫環境」下的實用權宜之計,核心在於結構化序列化、併發鎖定、索引分離三大原則。理解這些原理,不僅能解決當下部署限制,更能深化對資料庫底層運作(B+ 樹、WAL、鎖機制)的認知。