專案分前後台,共用同一份 config.php。後台修改全域設定後,需同步更新前台的設定檔。本文示範以「模板 + 佔位符替換 + copy 備份」方式實現原子性更新。
_saveconfig.php(含 ~`~KEY~`~ 佔位符)。$arr 將佔位符替換為最新設定值。copy() 現有前台設定檔為 bak.config.php 備份。file_put_contents() 寫入新設定檔。copy() 同步至後台目錄(或反向)。// _saveconfig.php
$srcFile = '../'.$dRootDir.'#data/config.php'; // 模板來源
$dstFile = $dRootDir.'config.php'; // 目標前台設定檔
$content = file_get_contents($srcFile);
$arr = array(
array('SITENAME', $gSite['siteName']),
array('DBHOST', $gDb['host']),
// ... 其他設定項
array('DATE', date('Y-m-d')),
array('USER', $dAdminName)
);
foreach ($arr as $item) {
$content = str_replace('~`~'.$item[0].'~`~', $item[1], $content);
}
// 備份舊檔
copy($dstFile, $dRootDir.'bak.config.php');
// 寫入新檔
file_put_contents($dstFile, $content);
// 同步至後台(或其他節點)
copy($dstFile, '../'.$dRootDir.'config.php');
$gDb = array(
'host' => '~`~DBHOST~`~',
'user' => '~`~DBUSER~`~',
'pwd' => '~`~DBPWD~`~',
'db' => '~`~DBNAME~`~',
'prefix' => '~`~DBPREFIX~`~'
);
// ... 其他設定同理
| 優點 | 缺點/風險 |
|---|---|
| 邏輯簡單,無需額外套件 | 佔位符若出現在註解或字串中會被誤替換 |
| 備份機制直觀 | 並發寫入可能導致資料遺失(無鎖機制) |
| 適用靜態設定檔部署 | 陣列巢狀結構難以用單層替換處理 |
json_encode/decode、parse_ini_file,原生支援巢狀結構與型別。vlucas/phpdotenv(環境變數)、symfony/config(多環境合併驗證)。.tmp 後 rename() 覆蓋,避免讀取到半寫入檔案。flock() 防止並發競爭。「模板+替換」是早期 PHP 專案常見的設定同步手法,理解其運作原理有助於維護舊系統。新專案請採用結構化設定格式與成熟套件,獲得更好的型別安全、環境隔離與部署自動化支援。