WiKiss 0.3 配置参数详解

WiKiss 0.3 唯一配置文件 _config.php 的 25 个变量参数全集:加载机制与覆盖优先级源码解析,鉴权/存储路径/时间本地化/界面文案逐组实测(含 Cookie 生命周期、LOCAL_HOUR 三处生效点、TIME_FORMAT 边界、备份开关),以及 opcache 延迟生效等排障实录。

WiKissWikiPHP自托管知识库2026/10/30

WiKiss 0.3 配置参数详解

WiKiss 0.3 的全部配置收敛在站点根目录的一个 _config.php 文件里:出厂 25 个变量,没有任何数据库表、环境变量或后台设置页。本文以官方 0.3.tgz 发布包原文件为基准(与 《Ubuntu 22.04 安装 WiKiss 0.3 指南(PHP 8.1 兼容修复实录)》 实测环境逐字节 diff 一致),先讲清加载机制与覆盖优先级,再按「鉴权 → 存储路径 → 时间与本地化 → 站点标识 → 界面文案」逐组给出全部参数的实测行为——每个关键结论都有 HTTP 回显或落盘验证。页面保存、鉴权三通道与 Cookie 机制的完整行为在 《WiKiss 0.3 核心使用与鉴权配置详解》 中展开,语法层面对参数的依赖(如 $LANG 决定维基百科链接语言)见 《WiKiss 0.3 页面语法与常用操作详解》。

一、配置文件与加载机制

1.1 文件形态与出厂值

_config.php 就是一个普通 PHP 文件,WiKiss 启动时直接 include。出厂文件(0.3.tgz 原样,25 个变量)节选:

<?php # coding: utf-8
// Configuration du mot de passe
	$PASSWORD			=	"test";
// Paramètres divers
    $LANG		        =	"fr";
    $TIME_FORMAT		=	"%Y/%m/%d %R";
    $LOCAL_HOUR			=	"0";
	$PAGES_DIR			= 	"pages/";
	$BACKUP_DIR			=	"historique/"; //historique/
// Variables de configuration de langues
    $WIKI_TITLE			=	"WiKiss : le Wiki Kiss";
    $START_PAGE			=	"Accueil";
    ...(界面文案变量 14 个,见第二节总表)
    $ERASE_COOKIE       =   "Eff. cookie";
?>

一个需要纠偏的事实:官方发布包的 $PASSWORD 出厂值是 "test",不是空字符串(本文实测环境与原始发布包 diff 无差异)——很多资料(含本文姊妹安装篇初稿)写成"默认为空即匿名可编辑",那是更早的 TigerWiki 或其他分支的口径。装完 0.3 若不改配置,用 test 就能编辑全站,等于半个匿名模式。

1.2 加载顺序与覆盖优先级

index.php 的加载顺序决定了哪些变量能通过配置覆盖(源码行号实测核对):

  1. 第 5 行:$WIKI_VERSION = "WiKiss 0.3"; ——在 include 之前赋值;
  2. 第 13 行:include("_config.php"); ——配置文件整体加载,此后同名变量以配置为准;
  3. 第 57 行以后:内部变量初始化 $toc、$plugins_dir、$plugins、$template、$PAGE_TITLE_link、$editable 等——在 include 之后赋值。

由此得出两条覆盖规则:

  • $WIKI_VERSION 可以被配置覆盖(它在 include 前定义)。实测在 _config.php 的 ?> 前追加 $WIKI_VERSION = "WiKiss 0.3-custom"; 并重启 Apache,页脚渲染为 Wiki utilisant <a href="http://wikiss.tuxfamily.org/">WiKiss 0.3-custom</a>——多实例区分环境时有用,无功能影响;
  • $template、$PAGE_TITLE_link、$editable、$plugins_dir、$plugins 等内部变量在配置之后赋值,写了也会被覆盖,通过 _config.php 修改它们不生效——改模板请直接编辑 template.html,换插件目录请保持 plugins/ 名不变(或改源码第 58 行)。

1.3 修改配置的正确姿势与 opcache 时效

cd /var/www/wikiss
sudo cp _config.php _config.php.orig          # 改前留底
sudoedit _config.php
php -l _config.php                            # 语法校验,防白屏
sudo systemctl reload apache2                 # 建议重启/重载

其中 systemctl reload apache2 不是可选步骤:实测环境 PHP 8.1 的 opcache 配置为 opcache.revalidate_freq = 2(每 2 秒才检查一次脚本更新),本次实验中曾出现"改完配置立即请求仍走旧值"的延迟生效——一个典型实证是把 $BACKUP_DIR 置空后 3 秒内保存页面,备份文件仍然写出来了;将配置修改动作与 Apache 重启绑定后,行为与源码逻辑完全一致。生产环境把"改配置"和"重启 Web 服务"当成一个原子操作,可以规避这类难排查的玄学。

另外 _config.php 里存着全站编辑口令,权限建议收紧为 640、属主 www-data(Web 进程要读,其他系统用户不必读)。

二、配置参数总表(25 个)

按出厂文件顺序分组列出,"生效位置"栏标注实测/源码核对的触发点:

变量出厂值作用与生效位置
$PASSWORD"test"全站编辑口令;保存校验 + Cookie 种子(第三节实测)
$LANG"fr"<html lang> 属性、[?词条] 维基百科链接语言、RSS <language> 标签(第五节实测)
$TIME_FORMAT"%Y/%m/%d %R"strftime 格式;最近更改列表与 RSS 条目描述(第五节实测,注意页面顶栏不受它控制)
$LOCAL_HOUR"0"时区偏移小时数;页面顶栏时间、备份文件名、页脚日期、最近更改时间四处(第五节实测)
$PAGES_DIR"pages/"页面存储目录,路径拼接用(第四节)
$BACKUP_DIR"historique/"历史备份目录,置空关闭备份(第四节实测)
$WIKI_TITLE"WiKiss : le Wiki Kiss"浏览器标题、RSS 频道标题与描述(第六节实测)
$START_PAGE"Accueil"首页页面名;?page= 省略时的默认页(第六节实测)
$HOME_BUTTON"Accueil"导航"首页"按钮文字(第六节实测)
$HELP_BUTTON"Aide"编辑表单里"帮助"链接的文字与目标页(第六节实测)
$DEFAULT_CONTENT"La page %page% est vide."新页面占位文本,%page% 替换为页面名(第六节实测)
$EDIT_BUTTON"Éditer"页面右上"编辑"按钮文字
$DONE_BUTTON"Enregistrer"编辑表单"保存"按钮文字
$PROTECTED_BUTTON"Page verrouillée"页面文件只读时的锁定提示(第六节 chmod 实测)
$SEARCH_BUTTON"Rechercher"搜索框提交按钮文字(accesskey="q")
$SEARCH_RESULTS"Résultats de recherche pour"搜索结果页标题前缀(?action=search 时拼在关键词前)
$LIST"Liste des pages"页面列表标题(搜索未填关键词时也落到列表页)
$RECENT_CHANGES"Changements récents"最近更改页标题与导航链接文字
$LAST_CHANGES"Dernière modification"页面顶栏"最后修改于"前缀文字
$HISTORY_BUTTON"Historique"编辑页"历史"链接文字
$NO_HISTORY"Aucun historique existant."无备份时历史页的空态文案(语法篇改名反例实测出现过)
$RESTORE"Restaurer"历史页"恢复"链接文字
$MDP"Mot de passe"编辑表单口令输入框的提示文字
$ERROR$MDP." spécifié incorrect."口令错误提示(&error=1 时渲染进 {ERROR} 占位符)
$ERASE_COOKIE"Eff. cookie"已登录时页脚"清除 Cookie"链接文字(第三节实测)

前三组(鉴权/存储/时间本地化)行为复杂、值得逐个实测;后三组多为纯文案替换,掌握生效位置即可按需本地化。

三、鉴权参数:$PASSWORD

0.3 没有用户体系,$PASSWORD 一个字符串就是全部鉴权。判定逻辑(authentified(),index.php 第 18-33 行)实测矩阵(设 $PASSWORD = "q1w2e3r4"):

请求实测结果
POST 保存,sc=WRONG302 → ./?page=AuthTest&action=edit&error=1,文件不落盘
POST 保存,sc=(空)302 → &error=1,文件不落盘
POST 保存,sc=q1w2e3r4302 → ./?page=AuthTest,落盘,同时下发展示 Cookie
已持正确 Cookie,POST 不带 sc302 → ./?page=AuthTest,保存成功
持旧口令的 Cookie(改口令前签发)302 → &error=1——改口令即全员强制重新登录

口令正确时的响应头实测(Cookie 值就是口令的 md5,有效期一年):

Location: ./?page=AuthTest
Set-Cookie: AutorisationWiKiss=c62d929e7b7e7b6165923a5dfc60cb56; expires=Sat, 30-Oct-2027 06:54:17 GMT; Max-Age=31536000

三个安全相关推论(全部可从上表与机制推出):md5("q1w2e3r4") = c62d929e7b7e7b6165923a5dfc60cb56,拿到 Cookie 等于拿到口令,生产必须走 HTTPS;$PASSWORD 为空串时 authentified() 恒真(匿名可写模式);改口令后所有旧 Cookie 立即失效(md5 不匹配),这是 0.3 里唯一"踢人"手段。

已登录后页脚出现清除入口,实测渲染:

<a href="./?page=BackupOff&amp;erasecookie=1" rel="nofollow">Eff. cookie</a>

点击访问 &erasecookie=1 后 Cookie 被置空、该链接实测消失——对应 $ERASE_COOKIE 只管这行文字,逻辑固定。

四、存储路径参数:$PAGES_DIR 与 $BACKUP_DIR

4.1 $PAGES_DIR:页面目录

所有页面读写、页面列表、最近更改都按 $PAGES_DIR . $PAGE_TITLE . ".txt" 拼接(index.php 第 161、205、320 行等十几处)。两个注意点:

  • 尾斜杠必须保留:拼接是纯字符串连接,写成 "pages" 会生成 pages页面名.txt 这类错误路径,页面系统整体错乱;
  • 换目录(如 pages2/)等于"换库"——原 pages/ 全部页面从站点消失,且不会迁移。做页面目录级备份(整目录 tar)时记得连同 historique/ 一起。

4.2 $BACKUP_DIR:历史备份开关与目录

保存路径源码里 if ($BACKUP_DIR <> '') 才写备份——置空字符串即关闭备份。干净环境实测(隔离重测,Apache 重启后):

# $BACKUP_DIR = "" 时保存页面
POST /  → 302 ./?page=BackupOff(保存成功)
ls historique/BackupOff/   → 目录无新文件(备份未写)

# 恢复 $BACKUP_DIR = "historique/" 后再次保存
ls historique/BackupOff/   → 20261030-0704.bak(备份恢复)

备份文件格式实测(同分钟内的多次保存会 append 进同一个 .bak):

// 2026/10/30 06:54 /  172.17.0.1
no backup test

// 2026/10/30 06:54 /  172.17.0.1
backup on again

首行是 $LOCAL_HOUR 校正过的日期时间 + 编辑者 IP,后接当次保存的完整内容。两个运维结论:备份关闭只是"不再新增",historique/ 里已有的 .bak 仍然可用于恢复(历史回填机制见使用篇);备份文件名按分钟粒度生成(date("Ymd-Hi", mktime(date("H") + $LOCAL_HOUR))),同一分钟内反复编辑会合并进一个文件。

五、时间与本地化参数

5.1 $LOCAL_HOUR:时区偏移(中国填 8)

一个数字在四处生效,全部实测(容器系统时区为 UTC,$LOCAL_HOUR 从 0 改为 8,宿主机当时 14:53):

生效点LOCAL_HOUR=0LOCAL_HOUR=8
页面顶栏"最后修改"2026/10/30 06:532026/10/30 14:53
页脚日期2026/10/30 06:53 --2026/10/30 14:53 --
新备份文件名20261030-0653.bak20261030-1453.bak
最近更改列表时间2026/10/30 06:53(同规则 +8h)

顶栏时间实测渲染 Dernière modification : 2026/10/30 14:53——即 filemtime() + $LOCAL_HOUR*3600。对中文部署:系统时区保持 UTC、$LOCAL_HOUR = "8",显示时间即北京时间;反之系统时区设为 Asia/Shanghai 时这里要填 0,两边只能选一头,填重了时间会飘 8 小时。

5.2 $TIME_FORMAT:strftime 格式(生效范围有限)

改为 "%Y-%m-%d %H:%M" 后实测:最近更改列表变为 LocalHourTest</a> (2026-10-30 06:53 - <a href="./?page=LocalHourTest&amp;action=diff">diff</a>),而页面顶栏的"最后修改"仍是 2026/10/30 06:53——顶栏用的是硬编码 date("Y/m/d H:i"),不受 $TIME_FORMAT 控制。该参数实际只作用于最近更改列表(strftime)与 RSS 条目描述两处,想统一全站时间样式是做不到的,这是 0.3 的硬编码局限。RSS 条目的 pubDate 还有一层:date("r", mtime) 原样输出服务器时间戳,同样不带 $LOCAL_HOUR 偏移。

5.3 $LANG:不是"语言包"开关

0.3 没有语言包加载机制,界面上所有法语词都来自 _config.php 的那些文案变量本身——把界面变中文的方式是逐个改写文案变量,$LANG 本身只在三处生效(全部实测):

1. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">   ($LANG="en" 实测)
2. <a href="http://en.wikipedia.org/wiki/Wiki" class="url" title="Wikipedia">Wiki</a>   ([?Wiki] 链接,fr 时为 fr.wikipedia.org)
3. RSS 频道 <language>fr</language>   (wkp_Rss 模板占位符替换)

设 $LANG = "zh" 可让 [?词条] 指向中文维基百科,<html lang> 也随之正确,但界面文案不会跟着变——那 14 个文案变量才是"界面语言"。

六、站点标识与界面文案参数

6.1 $WIKI_TITLE 与 $START_PAGE / $HOME_BUTTON

改 $WIKI_TITLE = "WiKiss 0.3 实验站" 实测:浏览器标题 <title>WiKiss 0.3 实验站 - Accueil</title> 立即生效;但访问 /rss.xml 频道标题仍是旧值——RSS 是静态文件:wkp_Rss 插件在每次保存页面时重写根目录 rss.xml(源码注释原文"Fichier généré: rss.xml à la racine du wiki",实测文件 mtime 与最后一次保存时刻一致),纯改配置不会触发再生,下次任何人保存页面后 RSS 标题才更新。这也是排障点:改了站名却发现 RSS 订阅里还是旧名字,存一次任意页面即可。

$START_PAGE 决定不带参数访问 / 时渲染哪个页面,实测改为 沙盒页面(同时 $HOME_BUTTON = "首页"):

<title>WiKiss : le Wiki Kiss - 沙盒页面</title>
<h1><a href="./?page=%E6%B2%99%E7%9B%92%E9%A1%B5%E9%9D%A2">沙盒页面</a></h1>
导航区:首页 / <a href="./?action=recent" accesskey="3">Changements récents</a>

注意最后一行:当前页就是首页时,"首页"是纯文本而非链接(源码判断 $PAGE_TITLE == $START_PAGE 时直接输出 $HOME_BUTTON 文本);在其他页面时才是 <a href="./?page=Accueil" accesskey="1">Accueil</a> 链接形态。$START_PAGE 支持任意已有页面名(含中文,实测通过)。

6.2 $DEFAULT_CONTENT:新页面占位文本

访问不存在的页面时渲染的占位文本,%page% 实测替换为页面名。改为 "页面 %page% 尚未创建,点击「保存」即创建该页面。" 后访问 ?page=NewPage001:

页面 NewPage001 尚未创建,点击「保存」即创建该页面。

中文站必改项——出厂值是法语"La page %page% est vide."。这段文字会预填进编辑框(编辑不存在的页面时 textarea 里就是它),保存前记得清掉或直接在其上写正文。

6.3 按钮与锁定文案:$EDIT_BUTTON / $DONE_BUTTON / $PROTECTED_BUTTON

$EDIT_BUTTON(默认"Éditer")是页面右上编辑链接的文字;$DONE_BUTTON("Enregistrer")是编辑表单提交按钮。$PROTECTED_BUTTON 的触发条件实测:把页面文件对 Web 运行用户改为只读(chmod 444 pages/TestS9.txt),该页右上角按钮文字从"Éditer"变为 Page verrouillée(源码 is_writable() 判断),恢复 664 后按钮实测回归——这就是语法篇页面锁定操作的配置面。三个文案都支持中文与空格,直接改写即可。

6.4 $HELP_BUTTON 与 $MDP / $ERROR

$HELP_BUTTON(默认"Aide")比较特殊:实测它只在编辑表单区域渲染为帮助链接(<a href="./?page=Aide" accesskey="2">),浏览态的模板里 {(HELP)} 占位符被整体移除——既是链接文字又是目标页面名,指向一张不存在的页面时编辑表单里会出现 pending 红链。

$MDP("Mot de passe")是编辑表单口令框提示文字;$ERROR 出厂值是 $MDP." spécifié incorrect."——拼接表达式,跟随 $MDP 的取值,口令错误时(URL 带 &error=1)渲染进模板 {ERROR} 占位符。本地化时若单独改写 $ERROR,记得它默认引用 $MDP,两者顺序在配置文件里不能颠倒($ERROR 在 $MDP 之后定义)。

七、搜索与历史相关文案参数

  • $SEARCH_BUTTON("Rechercher"):搜索框提交按钮,实测带 accesskey="q" 快捷键;
  • $SEARCH_RESULTS("Résultats de recherche pour"):搜索结果页标题前缀,实测 ?action=search&query=Aide 时页面标题为 Résultats de recherche pour Aide(前缀 + 空格 + 关键词);
  • $LIST("Liste des pages"):全站页面列表的标题文字(搜索动作未带关键词时也会落到列表页);
  • $RECENT_CHANGES("Changements récents"):最近更改页标题与导航链接文字;
  • $LAST_CHANGES("Dernière modification"):页面顶栏前缀文字;
  • $HISTORY_BUTTON("Historique"):编辑页历史链接文字;$NO_HISTORY:历史页空态文案(语法篇改名漏改 historique/ 目录时实测出现过);$RESTORE("Restaurer"):历史版本"恢复"链接文字。

这组变量在保存路径上只有 $SEARCH_RESULTS 参与业务逻辑(拼进 $PAGE_TITLE),其余是纯展示文案,误改不会破坏功能、最多影响可读性。

八、FAQ 与排障

Q:改了 _config.php 没生效? 先 php -l _config.php 确认语法;再确认走了 Apache 重启/重载——opcache 的 revalidate_freq=2 窗口内请求会拿到旧值(本文 1.3 节有备份开关延迟生效的实证)。仍不生效的变量逐一核对 1.2 节覆盖规则($template 等内部变量改了也白改)。

Q:改完配置整站 500 / 白屏? _config.php 是被 include 的 PHP,语法错全站崩。php -l 预检 + 保留 _config.php.orig 底稿,出事秒回滚。

Q:口令改了,别人还能编辑? 旧 Cookie 在新口令下 md5 不匹配,实测立即失效(第三节矩阵)——若还能编辑,检查是不是改的 _config.php.orig 或没重启 Apache。

Q:RSS 里的站名/内容不是最新? rss.xml 是保存页面时才重写的静态文件(6.1 节实测),改配置不会触发;存一次任意页面即可再生。

Q:时间显示差 8 小时? $LOCAL_HOUR 与系统时区重复叠加(5.1 节):系统是 UTC 就填 8,系统是 Asia/Shanghai 就填 0,只填一处。

Q:备份文件里同一个时间戳有两段内容? .bak 以 append 模式写,同一分钟内的多次保存合并进同一文件(4.2 节回显),内容按 // 日期 / IP 分段,不是文件损坏。

Q:想全站只读怎么办? 0.3 没有只读开关:$PASSWORD 设强口令防写(浏览永远匿名),再对特定页面 chmod 444 锁定(6.3 节);页面目录整体 555 可实现全站锁定,但编辑与备份会同时失效,仅作迁移/归档场景使用。