首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

無 MySQL 環境下的 PHP 資料儲存替代方案:檔案型資料庫實作

     編輯:PHP 綜合知識

適用場景

免費虛擬主機常不提供 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()
索引概念主索引檔 + 內容分離儲存類似資料庫的聚集索引+溢位頁思想

進階改良建議

  1. 改用 flock() 替代鎖檔:flock($fp, LOCK_EX) 為阻塞式鎖,避免忙等待浪費 CPU。
  2. 引入 JSON/serialize 格式:單檔儲存陣列結構,json_decode(file_get_contents()) 即可取得關聯陣列,省去手動分割。
  3. 分頁與快取:大量資料時,建立「頁碼→行號範圍」的二級索引檔,或用 APCu、Redis 快取熱門查詢。
  4. 資料完整性:寫入前計算 CRC32 校驗碼附加於行尾,讀取時驗證防損壞。
  5. 遷移至 SQLite:若主機支援 PDO SQLite,直接用 new PDO('sqlite:data.db') 獲得完整 SQL 功能,零配置、單檔案、支援索引/事務。

總結

檔案型儲存是「無資料庫環境」下的實用權宜之計,核心在於結構化序列化、併發鎖定、索引分離三大原則。理解這些原理,不僅能解決當下部署限制,更能深化對資料庫底層運作(B+ 樹、WAL、鎖機制)的認知。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved