PHP 5.1+ 內建 PDO_SQLITE 與 SQLite3 兩套擴展,預設啟用。確認:
php -m | grep -i sqlite
# pdo_sqlite
# sqlite3
<?php
$dbFile = __DIR__ . '/data/app.sqlite';
$pdo = new PDO("sqlite:$dbFile");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// 建立資料表
$pdo->exec("
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
country CHAR(2),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
");
// 插入資料(預處理防注入)
$stmt = $pdo->prepare("INSERT INTO users (username, email, country) VALUES (?, ?, ?)");
$stmt->execute(['alice', 'alice@example.com', 'TW']);
$stmt->execute(['bob', 'bob@example.com', 'US']);
echo "Last ID: " . $pdo->lastInsertId();
// 查詢
$stmt = $pdo->query("SELECT username, country FROM users");
foreach ($stmt as $row) {
echo "{$row['username']} ({$row['country']})\n";
}
// 事務範例
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (username, email) VALUES ('charlie', 'charlie@example.com')");
$pdo->exec("UPDATE users SET country = 'JP' WHERE username = 'alice'");
$pdo->commit();
} catch (Throwable $e) {
$pdo->rollBack();
throw $e;
}
<?php
$db = new SQLite3(__DIR__ . '/data/app.sqlite');
$db->exec('PRAGMA journal_mode = WAL;'); // 開啟 WAL 模式提升併發讀取
$db->exec('PRAGMA busy_timeout = 5000;'); // 鎖定等待 5 秒
$stmt = $db->prepare('SELECT * FROM users WHERE country = :c');
$stmt->bindValue(':c', 'TW', SQLITE3_TEXT);
$result = $stmt->execute();
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
print_r($row);
}
PRAGMA journal_mode = WAL; 允許讀寫並行,大幅提升併發吞吐。| 問題 | 原因 | 解決 |
|---|---|---|
| 資料庫鎖定 | SQLite 檔案鎖機制,寫入時阻擋其他寫入 | WAL 模式、縮短事務、重試機制、考慮改用 PostgreSQL/MySQL 高併發寫入場景 |
| 檔案權限錯誤 | 目錄/檔案不可寫 | 確保 PHP 進程使用者對資料庫目錄有寫入權限 |
| 大檔案效能下降 | 無索引、碎片化 | 建立索引、定期 VACUUM、分表/歸檔 |
| 日期時間處理 | SQLite 無原生 DateTime 型別,存 TEXT/INTEGER/REAL | 統一用 ISO8601 TEXT (`CURRENT_TIMESTAMP`) 或 UNIX 時間戳 INTEGER,應用層統一格式化 |
open_basedir 限制存取路徑。SQLite 是 PHP 開發者工具箱中的「瑞士刀」:零運維、標準 SQL、攜帶方便、效能驚人。善用 PDO、WAL、索引、JSON1/FTS5,即可在中小型專案、測試、CLI 工具、邊緣裝置中發揮最大價值。