`includes/init.php` 是 ECShop 所有前台頁面的統一入口引導檔,負責完成從安全檢查、環境初始化、核心服務啟動到模板引擎就緒的全過程。本文逐段解析其關鍵代碼邏輯,幫助開發者快速定位問題、進行效能調優或安全加固。
1-15 版權/授權宣告 17-20 定義 IN_ECS 防止跨目錄引入 22-28 錯誤報告、防止直接訪問核心檔 30-31 定義 ROOT_PATH(專案根目錄) 33-39 檢查安裝鎖,未安裝則導向安裝程序 41-49 PHP 環境初始化(記憶體、Session 設定、錯誤顯示) 50-56 設定 include_path(Windows/Linux 區分) 58 載入 data/config.php 核心配置 60-63 定義 DEBUG_MODE 常數 65-69 PHP 5.1+ 設定時區 71-79 解析 PHP_SELF,補全 index.php 81-92 引入核心類庫與函數庫 93-107 GPC 魔術引號檢查與 addslashes_deep 轉義 109-114 建立 ECS 對象,定義 DATA_DIR/IMAGE_DIR 116-121 初始化資料庫連線,設定不緩存表 123-124 建立錯誤處理對象 126-127 載入系統參數 $_CFG 129-130 載入語言包 131-137 商店關閉模式處理 139-157 蜘蛛/爬蟲訪問處理(不建立 Session、不記錄日誌) 159-167 正常用戶 Session 初始化 169-208 Smarty 模板引擎初始化與變數賦值 210-264 會員資訊處理(Cookie 自動登入、訪客統計、推薦會員) 266-274 依 DEBUG_MODE 調整錯誤報告級別 275-278 載入除錯工具 280-288 Gzip 輸出緩衝啟動 290 結束
define('ROOT_PATH', str_replace('includes/init.php', '', str_replace('\\', '/', __FILE__)));
if (!file_exists(ROOT_PATH . 'data/install.lock') && !file_exists(ROOT_PATH . 'includes/install.lock') && !defined('NO_CHECK_INSTALL')) {
header("Location: ./install/index.php");
exit;
}
require(ROOT_PATH . 'data/config.php');
`config.php` 回傳陣列或定義變數:`$db_host`、`$db_user`、`$db_pass`、`$db_name`、`$prefix`、`$timezone`、`$cookie_path`、`$cookie_domain` 等。此檔案由安裝程序生成,**極度敏感**,生產環境務必設定 `chmod 600`、防止 Web 直接訪問。
require(ROOT_PATH . 'includes/inc_constant.php'); // 常數定義:錯誤碼、商品類型、訂單狀態等 require(ROOT_PATH . 'includes/cls_ecshop.php'); // ECS 類 require(ROOT_PATH . 'includes/cls_error.php'); // 錯誤處理 require(ROOT_PATH . 'includes/lib_time.php'); // 時間格式化函數 require(ROOT_PATH . 'includes/lib_base.php'); // 基礎工具函數 require(ROOT_PATH . 'includes/lib_common.php'); // 通用業務函數(分類樹、模板賦值等) require(ROOT_PATH . 'includes/lib_main.php'); // 首頁/列表頁數據組裝 require(ROOT_PATH . 'includes/lib_insert.php'); // 動態區塊 insert 函數集 require(ROOT_PATH . 'includes/lib_goods.php'); // 商品相關核心邏輯 require(ROOT_PATH . 'includes/lib_article.php'); // 文章/資訊邏輯
**優化建議**:生產環境可合併為單一 `core_functions.php` 減少 `require` 系統呼叫開銷,配合 Opcode 緩存效果更佳。
if (!get_magic_quotes_gpc()) {
$_GET = addslashes_deep($_GET);
$_POST = addslashes_deep($_POST);
$_COOKIE = addslashes_deep($_COOKIE);
$_REQUEST= addslashes_deep($_REQUEST);
}
require(ROOT_PATH . 'includes/cls_mysql.php');
$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);
$db->set_disable_cache_tables(array(
$ecs->table('sessions'),
$ecs->table('sessions_data'),
$ecs->table('cart')
));
$db_host = $db_user = $db_pass = $db_name = NULL; // 清除敏感變數
require(ROOT_PATH . 'includes/cls_template.php');
$smarty = new cls_template;
$smarty->cache_lifetime = $_CFG['cache_time'];
$smarty->template_dir = ROOT_PATH . 'themes/' . $_CFG['template'];
$smarty->cache_dir = ROOT_PATH . 'temp/caches';
$smarty->compile_dir = ROOT_PATH . 'temp/compiled';
if ((DEBUG_MODE & 2) == 2) { // 除錯模式:強制編譯、直接輸出
$smarty->direct_output = true;
$smarty->force_compile = true;
} else {
$smarty->direct_output = false;
$smarty->force_compile = false;
}
// 註冊常用變數
$smarty->assign('lang', $_LANG);
$smarty->assign('ecs_charset', EC_CHARSET);
$smarty->assign('ecs_css_path', ...);
if (!defined('INIT_NO_SMARTY') && gzip_enabled()) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
| 問題 | 定位行號 | 解決方向 |
|---|---|---|
| 首頁白屏/500 | 任意 require 失敗 | 檢查 `error_log`、權限、路徑、語法錯誤;啟用 `DEBUG_MODE=1` 顯示錯誤 |
| Session 丟失/頻繁登出 | 159-167, cls_session.php | 檢查 `session.save_path` 權限、資料庫 `sessions` 表鎖、Cookie domain/path 設定 |
| 模板修改不生效 | 184-193 | 後台清除緩存、檢查 `force_compile`、確認模板目錄正確 |
| 中文亂碼 | 65-69, 129-130 | 確認 `data/config.php` `$timezone`、`EC_CHARSET`、資料庫連線字符集、語言包編碼 |
| Gzip 輸出異常 | 280-288 | 關閉 `ob_gzhandler`、檢查 `zlib` 擴展、確認無輸出前已送 Header |
`init.php` 雖長,但邏輯清晰:安全 → 環境 → 配置 → 核心服務 → 業務上下文 → 輸出準備。熟悉此流程,等於掌握了 ECShop 的「生命週期主動脈」,對除錯、效能調優、安全審計皆具指導意義。