LimeSurvey 配置参数详解
LimeSurvey 7.7 配置参数详解:config.php/config-defaults.php/security.php/email.php 分层覆盖体系、数据库与 URL 路由参数、212 项默认值分组精讲、Docker 环境变量全表与会话/主题/插件实务,全部实测摘录。
LimeSurvey 配置参数详解
版本基线:LimeSurvey Community Edition 7.7.0(
martialblog/limesurvey:7.7.0-261020-apache,2026-10-27 构建),参数均从该版本实际文件摘录 实测环境:按 《LimeSurvey 7.7 Docker Compose 部署实战》 完成部署的 7.7 实例,应用根目录/var/www/html读者前置:已完成部署安装;涉及数据库/URL/安全等运维主题
一、配置体系总览
LimeSurvey 的配置是「PHP 数组分层覆盖」体系:全部可调参数都有内置默认值,站点级覆盖写在 config.php,密钥类写在 security.php,邮件默认值单独放在 email.php。7.7.0 版本实际文件的布局如下(实测 application/config/ 目录清单):
| 文件 | 角色 | 是否可直接修改 |
|---|---|---|
config-defaults.php | 全量默认值(实测 884 行、约 212 个 $config 参数),升级时会被覆盖 | ❌ 严禁直接编辑 |
config.php | 站点覆盖文件:数据库连接、URL 路由、站点级参数 | ✅ 唯一的常规改动入口 |
security.php | 应用加密密钥(数据加密、令牌加密的根密钥) | ⚠️ 自动生成;一旦生成严禁更换 |
email.php | 邮件默认值(SMTP 参数组) | ⚠️ 只读参考,覆盖写进 config.php |
ldap.php / tcpdf.php / routes.php / vendor.php | LDAP、PDF、路由、composer 依赖清单等专题配置 | 按需 |
config-sample-*.php | mssql/sqlsrv/dblib/pgsql/mysql 五种数据库连接示例 | 模板 |
version.php / updater_version.php | 版本号声明 | ❌ |
覆盖规则写在 config-defaults.php 文件头(实测原文):copy the lines corresponding to the parameter you want to change from this file to the config.php file——要改哪个参数,就把那一行拷贝到 config.php 的 config 数组里改值,config.php 中的同名键优先生效,未覆盖的参数回落到默认值。邮件参数同理:把 email.php 中的行拷到 config.php 覆盖。
💡 技术拓展:这类「defaults 文件 + 站点覆盖文件」是 PHP 应用的经典配置分层,WordPress(
wp-config.php)、Drupal(settings.php)、Nextcloud(config/config.php)同属此列。优点是升级不丢配置、默认值有单一事实源;代价是改参数必须理解「覆盖发生在哪一层」——在config-defaults.php里直接改,升级即失效,这是最常见的误操作。
二、config.php 结构解剖
config.php 返回一个两层 PHP 数组:components(框架组件配置:数据库/路由/会话)与 config(应用级参数)。以下是本文实测实例(Docker 静默安装由镜像 entrypoint 生成)的完整内容:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
return array(
'components' => array(
'db' => array(
'connectionString' => 'mysql:host=db;port=3306;dbname=limesurvey;',
'emulatePrepare' => true,
'username' => 'limesurvey',
'password' => 'q1w2e3r4',
'charset' => 'utf8mb4',
'tablePrefix' => 'lime_',
),
//'session' => array (
// 'class' => 'application.core.web.DbHttpSession',
// 'connectionID' => 'db',
// 'sessionTableName' => '{{sessions}}',
//),
'urlManager' => array(
'urlFormat' => 'path',
'rules' => array(),
'showScriptName' => true,
),
),
'config'=>array(
'publicurl'=>'',
'debug'=>0,
'debugsql'=>0,
'mysqlEngine' => 'InnoDB',
)
);
而走 Web 图形向导安装的第二实例生成的 config.php(实测)结构相同,但有两点差异:向导版保留了 Yii 标准注释头(数据库连接说明),且会话段生成随机 sessionName:
'session' => array (
'sessionName'=>'LS-ZPPJOIUAZOPENULW',
// Uncomment the following lines if you need table-based sessions.
// Note: Table-based sessions are currently not supported on MSSQL server.
// 'class' => 'application.core.web.DbHttpSession',
// 'connectionID' => 'db',
sessionName 前缀 LS- + 随机串用于多实例同域名下会话隔离;两份文件可直接对照出「自动化生成」与「向导生成」的差别。
三、数据库参数(components.db)
| 参数 | 实测值 | 说明 |
|---|---|---|
connectionString | mysql:host=db;port=3306;dbname=limesurvey; | PDO DSN。驱动类型可选 mysql/pgsql/mssql(MSSQL 另有 dblib/sqlsrv 变体,见 config-sample-*.php);官方安装手册对数据库的最低版本要求:MariaDB 10.3.38+ 或 MySQL 8+ 或 PostgreSQL 14+ |
emulatePrepare | true | PDO 模拟预处理,MySQL 驱动下官方示例固定开启 |
username / password | limesurvey / q1w2e3r4 | 数据库账号。官方手册建议的最小权限集:SELECT/CREATE/INSERT/UPDATE/DELETE/ALTER/DROP/INDEX |
charset | utf8mb4 | MySQL 系用 utf8mb4(完整四字节 Unicode),PostgreSQL 用 utf8 |
tablePrefix | lime_ | 表前缀。多实例共用一个库时用前缀隔离 |
配套的表引擎由 config 层的 mysqlEngine 决定:
- 默认 MyISAM(历史默认值);
- 本文实例设为 InnoDB(事务、行锁、崩溃恢复)。官方文件对该开关有一句历史性警告:MyISAM 的表行数上限更高,「Using InnoDB instead of MyISAM will reduce the possible maximum number of questions in your surveys」(InnoDB 下单问卷可建题数会变少)——超大规模题库场景才需要权衡,一般部署选 InnoDB。
数据库连接类的排障手段:临时把 config.php 的 debug 设为 2(见第五章)后访问站点,PDO 连接异常会以完整堆栈展示;生产定位完务必改回 0。
四、URL 与路由参数(components.urlManager)
| 参数 | 实测值 | 说明 |
|---|---|---|
urlFormat | path | 7.x 只支持 path。官方安装手册原文:The URL format must be set to path (URLs like index.php/admin)。旧的 get 格式(index.php?r=admin)在 7.x 已不被支持。安装器与镜像 entrypoint 都会自动写 path;只有复用旧版 config.php 时需要人工检查 |
showScriptName | true | URL 中保留 index.php 前缀;配合 Web 服务器 rewrite 规则可隐藏入口脚本(隐藏后仍需保证 path 路由) |
rules | array() | 自定义路由规则表,一般留空 |
publicurl(config 层) | '' | 受访者侧公开 URL。默认值逻辑(实测 config-defaults):Web 上下文取 Yii::app()->baseUrl . '/',CLI 上下文取 /。反向代理/内外网域名分离场景才需要显式指定 |
homeurl | publicurl . 'admin' | 管理后台地址,随 publicurl 派生 |
反向代理场景(Docker 镜像的对应环境变量为 BASE_URL/HOST_INFO/PUBLIC_URL)会在 components 里额外生成 request 段(baseUrl + hostInfo),用于代理终止 TLS 或路径前缀转发时修正生成的链接。新实例登录后台后如果跳转域名不对,优先检查这三个值与代理的 X-Forwarded-* 头。
五、全局核心参数(config 层常用覆盖项)
以下参数全部实测摘录自 7.7.0 的 config-defaults.php(行号对应实际文件),按运维主题分组:
站点与展示
| 参数 | 默认值 | 说明 |
|---|---|---|
sitename | 'LimeSurvey' | 站点名称(窗口标题) |
defaultlang | 'en' | 缺省语言,可取值对应 /locale 目录(如 zh-Hans) |
displayTimezone | '' | 展示时区(如 Asia/Shanghai),空则 UTC |
defaulttheme | 'fruity_twentythree' | 问卷公开列表默认主题 |
defaultfixedtheme | 'vanilla' | 默认主题缺失时的兜底主题(核心主题的父级) |
memory_limit | '256' | 应用内存上限(MB),PDF 导出场景官方建议提到 512 |
max_execution_time | 1200 | PHP 最大执行时间(秒) |
安全与登录
| 参数 | 默认值 | 说明 |
|---|---|---|
maxLoginAttempt | 3 | 管理员连续错密码次数上限 |
timeOutTime | 60 * 10 | 触发锁定后的封禁时长(秒,默认 10 分钟) |
maxLoginAttemptParticipants / timeOutParticipants | 3 / 60 * 10 | 受访者令牌侧的同款锁定策略 |
force_ssl | 'off' | 强制 HTTPS。on 后若证书不可用站点直接不可访问,官方注释反复强调「DO NOT turn on unless you are sure」 |
ssl_emergency_override | false | SSL 锁死时的紧急逃生开关(置 true 强制关 SSL,修完即回 false) |
x_frame_options | 'sameorigin' | iframe 嵌入策略;deny 不受支持(会破坏主题编辑器预览与文件上传) |
passwordValidationRules | min:8, upper:1, numeric:1 | 密码策略数组(min/max/小写/大写/数字/符号各维度计数) |
iSessionExpirationTime | 7200 | 会话过期秒数(默认 2 小时) |
调试与升级
| 参数 | 默认值 | 说明 |
|---|---|---|
debug | 0 | 0 关闭;1 显示错误;2 追加 PHP STRICT 与 SQL 日志。排障利器,用完即关 |
debugsql | 0 | SQL 日志开关,仅 debug=2 时生效 |
updatecheckperiod | 7 | 联网检查新版本的天数间隔,0 为关闭 |
minimum_update_stability | 'rc' | 升级通知的稳定性门槛(alpha/beta/rc/stable) |
hide_update_key | false | 隐藏 ComfortUpdate 升级密钥中段显示 |
showserverconfigurationcheck | true | 数据完整性检查页是否显示 PHP 配置体检 |
令牌与参与者黑名单
| 参数 | 默认值 | 说明 |
|---|---|---|
blacklistallsurveys / blacklistnewsurveys | 'N' | 全局拉黑后是否波及现有/未来问卷 |
blockaddingtosurveys | 'Y' | 被拉黑者不得加入新问卷 |
allowunblacklist | 'N' | 是否允许自解除拉黑 |
上传与附件白名单(主题/资源/插件三组)
| 参数 | 默认值 | 说明 |
|---|---|---|
allowedthemeimageformats | gif,ico,jpg,jpeg,png | 主题图片格式白名单(SVG 因 XSS 风险默认排除) |
allowedthemeuploads | css,js,map,json,...,lss,lsa,lsq,lsg | 主题编辑器可上传的其余类型 |
allowedresourcesuploads | 7z,...,zip,css,js | 问卷资源与 HTML 编辑器的附件类型白名单 |
allowedpluginuploads | gif,...,php,html,po,mo,xsd,lss,... | 插件 ZIP 内容类型白名单 |
插件管控
| 参数 | 默认值 | 说明 |
|---|---|---|
usePluginWhitelist | false | 开启后非白名单插件不可安装/加载 |
pluginWhitelist | [] | 白名单数组(核心插件隐式放行) |
corePluginBlacklist | [] | 核心插件排除项 |
disablePluginUpload | false | 关闭后台上传插件入口(安全收敛手段) |
六、security.php:应用加密密钥
security.php 存放 LimeSurvey 数据加密体系的根密钥,7.7.0 实际文件包含五个键(默认值形态见 config-defaults):
$config['encryptionkeypair'] = '';
$config['encryptionpublickey'] = '';
$config['encryptionsecretkey'] = '';
$config['encryptionnonce'] = '';
$config['encryptionsecretboxkey'] = '';
应用首次运行时自动生成实际密钥并写入该文件(本文实例自动生成后含 encryptionnonce 与 encryptionsecretboxkey 等项)。文件头部的警告必须原文照录:
WARNING!!!
ONCE SET, ENCRYPTION KEYS SHOULD NEVER BE CHANGED, OTHERWISE ALL ENCRYPTED DATA COULD BE LOST !!!
即密钥一旦生成严禁更换:问卷令牌、SMTP 密码等加密字段的解密都系于这套密钥,丢失/更换等于密文报废。运维要求:
security.php必须纳入备份(与数据库成对,见运维实战篇);- 容器形态下该文件默认落在可写层——重建容器前先拷出,或用镜像的
ENCRYPT_*环境变量在首次启动时注入固定密钥(支持ENCRYPT_KEYPAIR/ENCRYPT_PUBLIC_KEY/ENCRYPT_SECRET_KEY/ENCRYPT_NONCE/ENCRYPT_SECRET_BOX_KEY,且均提供_FILE形态从文件注入); - 未提供密钥时 entrypoint 会打印三行 Warning 并交由应用自建,属预期行为。
七、Docker 形态的环境变量覆盖
容器形态下,config.php 不必手写——镜像 entrypoint 在首启时用环境变量拼装生成。7.7.0 镜像 README 与 entrypoint.sh 实测对照的完整变量表:
| 变量 | 默认值 | 作用 |
|---|---|---|
DB_TYPE | mysql | 数据库类型(mysql/pgsql) |
DB_HOST | mysql | 数据库主机(compose 服务名) |
DB_PORT | 3306 | 数据库端口 |
DB_SOCK | (空) | Unix socket 路径(设置了则替代 host/port 连接) |
DB_NAME | limesurvey | 库名 |
DB_TABLE_PREFIX | lime_ | 表前缀(值中的空白会被剥除) |
DB_USERNAME / DB_PASSWORD | limesurvey / (必填) | 连接账号;DB_PASSWORD 缺失时 entrypoint 直接报错退出 |
DB_CHARSET | mysql→utf8mb4 / pgsql→utf8 | 连接字符集 |
DB_MYSQL_ENGINE | MyISAM | 表引擎(写入 mysqlEngine) |
ADMIN_USER / ADMIN_NAME / ADMIN_EMAIL / ADMIN_PASSWORD | admin/admin/foobar@example.com/(必填) | 仅首次静默安装生效;装后修改无效(镜像 README 原文提示) |
BASE_URL / HOST_INFO / PUBLIC_URL | (空) | 反代场景的 request 修正与公开 URL |
URL_FORMAT | path | 写入 urlManager.urlFormat |
SHOW_SCRIPT_NAME | true | 写入 urlManager.showScriptName |
TABLE_SESSION | (空) | 非空则把 config.php 中被注释的 DbHttpSession 段整体取消注释(会话入库) |
DEBUG / DEBUG_SQL | 0 / 0 | 写入 debug / debugsql |
LISTEN_PORT | 8080 | Apache 监听端口(rootless 形态默认 8080) |
ENCRYPT_* 五项 | (空) | 注入加密密钥生成 security.php(支持 _FILE 文件注入) |
所有「普通值」变量都有对应的 <VAR>_FILE 文件注入形态(entrypoint 的 file_env 函数实现):同时给值与文件会报 exclusive 错误退出——密钥类变量建议统一走 _FILE。
环境变量与 config.php 的关系是「首启生成、此后不回写」:entrypoint 只在 config.php 不存在时生成;改环境变量后想让配置生效,需要删除容器内已生成的 config.php(或改用手写挂载),因此生产推荐直接挂载 config 目录做配置管理,环境变量只负责数据库连接这类引导参数。
八、邮件参数(email.php 专题)
7.7.0 把邮件默认值独立在 email.php(文件头同样标注 DO NOT EDIT,覆盖写 config.php)。实测全量参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
siteadminemail / siteadminbounce / siteadminname | '' / '' / 'Site admin' | 站点管理员邮箱/退信地址(Return-Path)/显示名;空值时后台全局设置里配置 |
emailmethod | 'mail' | 发信通道:mail(PHP Mailer 内置)/sendmail/smtp |
emailsmtphost | 'localhost' | SMTP 主机,带端口写 smtp.example.com:587 |
emailsmtpuser / emailsmtppassword | '' / '' | SMTP 认证(设了 user 必须设 password);密码在库中加密存储 |
emailsmtpssl | '' | 'ssl' 或 'tls'(StartTLS) |
emailsmtpdebug | 0 | SMTP 会话日志级别 0~3(邀请/提醒发送排障时开 2) |
maxemails | 50 | 单批发信上限(防超时,队列分批发送) |
emailcharset | utf-8 | 出站邮件字符集 |
生产建议:emailmethod 置 smtp 并指向独立邮件网关;发不出信先在后台「全局设置→邮件」发测试邮件,仍失败再把 emailsmtpdebug 提到 2 看完整 SMTP 会话。
九、主题与插件配置实务
- 主题查找路径:问卷主题安装目标为
upload/themes/survey/(admin 主题在admintheme参数,默认Sea_Green)。部署时 upload 目录必须保留该骨架(实测:骨架缺失导致全站 500,见部署篇排障实录①); - 主题开发调试:
force_xmlsettings_for_survey_rendering置true后主题改动即时生效,免卸载重装(官方注释:仅开发场景用); - 主题可上传类型:受第五章三组白名单约束;允许 SVG 需同时扩
allowedthemeimageformats与imagemimetypes映射(默认映射表实测含 gif/ico/jpg/jpeg/png 五类,官方注释明确警示 SVG 的 XSS 风险); - 插件安装:5.x 起 支持 ZIP 上传安装(依赖
disablePluginUpload=false);安全敏感环境开usePluginWhitelist只放行指定插件,pluginWhitelist列名即可,核心插件隐式放行、可用corePluginBlacklist排除。
十、缓存、会话与资产
- 会话存储:默认 PHP 文件会话;置
TABLE_SESSION环境变量(或手工取消 config.php 中session段注释)切换到数据库表会话(DbHttpSession,表{{sessions}})。官方注释的坑:大型问卷的参与者会话可增长到 15 MB 以上,表会话必须保证 MySQLmax_allowed_packet足够(建议 ≥64M),否则会话静默丢失不报错; - 资产缓存:前端合并产物在
tmp/assets/(customassetversionnumber参与生成路径),twig_cache、cache、HTML目录同在tmp/runtime下;改了主题/JS 却不生效时,清tmp资产目录或执行console.php flushassets(见运维实战篇)即可; - 上传体积:
maximum_unzipped_size(解压上限,默认 5 亿字节)之外,真实上限还受 PHPpost_max_size/upload_max_filesize约束——完整性检查页(showserverconfigurationcheck=true)会并列展示这四项。
十一、常见配置任务实例
任务 1:站点改中文 + 上海时区(在 config.php 的 config 数组追加):
'config'=>array(
'sitename'=>'青柠问卷平台',
'defaultlang'=>'zh-Hans',
'displayTimezone'=>'Asia/Shanghai',
// ... 原有项
)
任务 2:临时开排错模式:
'debug'=>2,
'debugsql'=>1,
排障完成后必须回 0——debug=2 会向受访者暴露堆栈与 SQL。
任务 3:强制 HTTPS(确认证书可用后再做,留好逃生开关):
'force_ssl'=>'on',
锁死后的恢复路径:数据库直改全局设置,或临时置 ssl_emergency_override=>true。
任务 4:管理员登录防爆破收紧:
'maxLoginAttempt'=>5,
'timeOutTime'=>60*30,
任务 5:会话入库(config.php 取消注释 + 数据库参数核对):
'session' => array (
'class' => 'application.core.web.DbHttpSession',
'connectionID' => 'db',
'sessionTableName' => '{{sessions}}',
),
同时确认 MySQL max_allowed_packet ≥ 64M(官方口径,理由见第十章)。
十二、排障实录(实测沉淀)
- 「改了参数不生效」:先确认改动写的是
config.php而不是config-defaults.php(后者升级即被覆盖);主题/前端类改动还要清资产缓存(第十章)。 config.php语法错误导致整站白屏:config.php是被require的 PHP 文件,语法错(漏逗号/引号)会让整个应用无法启动;改动前php -l application/config/config.php校验语法是零成本习惯。- 7.x 实例复用旧 config.php 后 URL 全 404:旧文件里
'urlFormat'=>'get',7.x 已不支持 get 路由(官方安装手册明确),改回'path'即恢复。 - 容器重建后管理员被「重置」的错觉:
ADMIN_*只在首次安装生效(第七章),重建容器不会重跑安装、也不会改密码;以为密码丢失时先确认是不是连接到了另一套数据库(DB_NAME/DB_HOST指向变化)。 - 加密字段解不开:
security.php与数据库不同步(恢复时只恢复了库没恢复密钥文件)。两者必须成对备份/恢复。
十三、参考链接
- LimeSurvey 官方手册 · Optional settings(config.php 参数全集):https://manual.limesurvey.org/Optional_settings
- LimeSurvey 官方手册 · Installation - LimeSurvey CE(URL 格式与数据库要求):https://manual.limesurvey.org/Installation_-_LimeSurvey_CE
- LimeSurvey 官方手册 · Encryption(security.php 加密体系):https://manual.limesurvey.org/Encryption
- 镜像 README(环境变量表与生成机制):https://hub.docker.com/r/martialblog/limesurvey
- 本专栏关联篇目:《LimeSurvey 介绍与选型指南》、《LimeSurvey 7.7 Docker Compose 部署实战》、运维实战篇(console.php、RemoteControl API 与备份恢复)