config.php(本地配置)> config.example.php(出厂默认)> $default * * config.php 不参与版本管理(见 .gitignore),新部署时可从 config.example.php 复制一份; * 若不存在则直接以 config.example.php 为默认值运行,保证 clone 下来即可跑。 */ function fb_cfg($path = null, $default = null) { static $merged = null; static $stamp = -1; $now = isset($GLOBALS['__fb_cfg_stamp']) ? (int)$GLOBALS['__fb_cfg_stamp'] : 0; if ($merged === null || $stamp !== $now) { $cfg = fb_cfg_file(); // 后台设置以嵌套数组形式叠加在文件配置之上(只覆盖同名键) $tree = function_exists('fb_setting_tree') ? fb_setting_tree() : []; $merged = is_array($tree) && $tree ? array_replace_recursive($cfg, $tree) : $cfg; $stamp = $now; } if ($path === null || $path === '') { return $merged; } $cur = $merged; foreach (explode('.', (string)$path) as $k) { if (is_array($cur) && array_key_exists($k, $cur)) { $cur = $cur[$k]; } else { return $default; } } return $cur; } } /** 让 fb_cfg() 的进程内缓存失效(改了磁盘上的 config.php 后必须调用) */ function fb_cfg_flush() { $GLOBALS['__fb_cfg_stamp'] = ((int)$GLOBALS['__fb_cfg_stamp']) + 1; } require_once FB_ROOT . '/lib/util.php'; require_once FB_ROOT . '/lib/db.php'; require_once FB_ROOT . '/lib/oss.php'; require_once FB_ROOT . '/lib/attach.php'; require_once FB_ROOT . '/lib/captcha.php'; require_once FB_ROOT . '/lib/mailer.php'; require_once FB_ROOT . '/lib/layout.php'; /* ------------------------------------------------------------------ * 安装引导:数据库还没生成(data/ 下没数据)就说明是全新部署, * 一律先送去 install.php 填配置、建库、设口令,装完才进系统。 * 判据只看「数据库文件在不在」——绝不能在这里调 fb_db(), * 因为那会就地建出一个空库、把安装态自己"装"出来,之后就再也进不了向导。 * ------------------------------------------------------------------ */ if (!defined('FB_SKIP_INSTALL_REDIRECT') && !fb_installed()) { if (PHP_SAPI === 'cli') { fwrite(STDERR, "FeedLite 尚未安装:请先在浏览器中打开本目录下的 install.php 完成安装。\n"); exit(1); } fb_redirect('install.php'); } // 会话(CLI 下不启用) if (PHP_SAPI !== 'cli' && session_status() !== PHP_SESSION_ACTIVE) { $p = session_get_cookie_params(); $https = (!empty($_SERVER['HTTPS']) && strtolower((string)$_SERVER['HTTPS']) !== 'off'); @session_set_cookie_params([ 'lifetime' => 0, 'path' => !empty($p['path']) ? $p['path'] : '/', 'domain' => '', 'secure' => $https, 'httponly' => true, 'samesite' => 'Lax', ]); @session_start(); } // 初始化数据库(建表)。 // ★ 只在【已安装】时做:未安装就建库,等于第一秒把这个状态自己抹掉, // 安装向导(install.php)随后就会被判定成「已经装好了」而拒绝工作。 // install.php 在真正提交安装时会自己显式调用 fb_db()。 if (fb_installed()) { fb_db(); // 顺手确保 uploads/ 目录与「禁止直读」规则在位且为最新版(local / oss 都需要)。 // ⚠️ 为什么放在这里:老站点上早已存在的旧版 .htaccess(曾允许直读)不会自己更新, // 而部署账号通常对 uploads/ 无写权限 —— 只有 PHP(目录属主)能改。 // 函数内部只在「文件缺失或版本标记过期」时才写盘,命中后每次请求几乎零开销。 if (function_exists('fb_local_ensure_dir')) { fb_local_ensure_dir(); } }