myTinyTodo 1.8.6 配置参数详解
myTinyTodo 1.8.6 两层配置体系详解:config.php 的 8 个 MTT_* 常量与数据库 config.json 的 24 个键逐一说明(类型/默认值/取值/入口),含扩展管理、清单级参数、忘记口令的 JSON_SET 恢复实测与生产配置模板。
myTinyTodo 1.8.6 配置参数详解
目标:逐一讲清 myTinyTodo 1.8.6 的两层配置体系——数据库连接层(
config.php的 8 个MTT_*常量)与应用行为层(存于数据库config.json单行 JSON 的 24 个键),给出每个参数的类型、默认值、取值范围、修改入口与实测验证方式。全部参数说明均在 Ubuntu 22.04.5 + myTinyTodo 1.8.6 环境实测核对。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(x86_64) |
| 应用版本 | myTinyTodo v1.8.6(官方 tar 包部署于 /var/www/mytinytodo-app) |
| Web 运行 | nginx 1.18.0 + php8.1-fpm(套接字 /run/php/php8.1-fpm.sock);Apache 2.4.52 + mod_php8.1(已切换验证) |
| 数据库后端 | SQLite 3.37.2(db/todolist.db)与 MariaDB 10.6.23(库 mytinytodo,表前缀 mtt_)双后端均实测 |
| 设置存储位置 | SQLite:settings 表;MariaDB:mtt_settings 表(同一逻辑结构) |
| 应用版本常量 | includes/version.php 中 Version::VERSION = '1.8.6'、Version::DB_VERSION = '1.8'(实测读取) |
二、前置条件
- 已按 《Ubuntu 22.04 安装 myTinyTodo 1.8.6 指南》 完成安装并能打开首页;
- 具备以下其一:Web 界面
settings.php的访问权限(已登录),或服务器上数据库命令行(sqlite3/mysql)读权限; - 了解 PHP
date()格式字符(j M Y等),三组日期格式参数都使用该语法。
三、参数查看与修改方式
3.1 两层配置体系总览
myTinyTodo 的配置分两层,修改入口和生效方式完全不同:
| 层 | 载体 | 内容 | 修改方式 | 生效方式 |
|---|---|---|---|---|
| 数据库连接层 | 文件 /var/www/mytinytodo-app/config.php | 8 个 MTT_* PHP 常量 | 手工编辑或重跑安装向导 | 下次请求生效(改 DB 类型需重新向导) |
| 应用行为层 | 数据库 settings 表 config.json 键(单行 JSON) | 24 个键(标题/语言/口令/时区/日期格式等) | Web 界面 settings.php(推荐)或直接改库 | 保存即时生效,无需重启任何服务 |
💡 技术拓展:「配置放文件还是放数据库」是 PHP 应用的常见两分法——放文件(如 WordPress 的 wp-config.php)便于版本管理与离线修改,但改库类型要动文件;放数据库便于 Web 在线改、多实例共享,但口令等敏感项也进库。myTinyTodo 采取折中:连接凭据放文件(安装时生成一次),行为参数放数据库(运行期随时改)。本文实际体系即为该折中方案。
3.2 Web 界面查看与修改(settings.php)
登录后打开 http://<服务器地址>/settings.php,表单字段与选项实测如下(直接从运行实例的页面 HTML 提取):
| 表单字段 | 控件类型 | 取值(实测) |
|---|---|---|
| title | 文本框 | 任意字符串(实测值 myTinyTodo) |
| lang | 下拉框 | 36 种语言,含 zh-cn 中文 (简体)、zh-tw 中文(繁體)、en English 等 |
| allowpassword | 单选 | 1(启用口令)/ 0(无口令开放读写) |
| password | 密码框 | 留空 = 不修改;填值 = 更新口令 |
| smartsyntax | 单选 | 1(启用智能语法)/ 0(关闭) |
| autotag | 单选 | 1(自动打标签)/ 0(关闭) |
| markdown | 单选 | 1(Markdown 渲染)/ 0(经典 v1.6 语法) |
| timezone | 下拉框 | 全量 PHP 时区列表(实测 Asia/Shanghai 在列) |
| firstdayofweek | 下拉框 | 0 Sunday / 1 Monday / 2 Tuesday / 3 Wednesday / 4 Thursday / 5 Friday / 6 Saturday |
| clock | 下拉框 | 12 12-hour (9:15 AM) / 24 24-hour (09:15) |
| dateformat / dateformat2 / dateformatshort | 文本框 | PHP date() 格式串,实测默认 j M Y / n/j/y / j M |
| showdate | 单选 | 1 / 0(列表内显示任务创建日期) |
| showdateInline | 复选框 | 勾选=1(日期内联在标题行) |
| showtime | 复选框 | 勾选=1(显示时间部分) |
| exactduedate | 单选 | 1(截止日期含时间)/ 0(仅日期) |
| appearance | 单选 | system / light / dark |
| newTaskCounter | 复选框 | 勾选=1(新任务计数角标) |
| newTaskCounterIcon | 复选框 | 勾选=1(浏览器标签页图标计数) |
保存后接口实测返回 {"saved":1},无需重启 Web 服务。
3.3 数据库直查(核对与恢复场景)
应用层配置在数据库里只有一行,直接 SELECT 即可查看全量 JSON(实测回显):
sqlite3 /var/www/mytinytodo-app/db/todolist.db \
"SELECT param_value FROM settings WHERE param_key='config.json';"
{
"url": "",
"mtt_url": "",
"title": "myTinyTodo",
"lang": "en",
"password": "sha256:13a5c202e320d0bf9bb2c6e2c7cf380a6f7de5d392509fee260b809c893ff2f9",
"smartsyntax": 1,
"timezone": "Asia\/Shanghai",
"autotag": 1,
"duedateformat": 1,
"firstdayofweek": 1,
"clock": 24,
"dateformat": "j M Y",
"dateformat2": "n\/j\/y",
"dateformatshort": "j M",
"showdate": 0,
"showtime": 0,
"showdateInline": 0,
"exactduedate": 0,
"markup": "markdown",
"appearance": "system",
"newTaskCounter": 0,
"newTaskCounterIcon": 0,
"extensions": []
}
MariaDB 后端时表带前缀(实测回显,SUBSTRING 截取前 150 字符):
mysql -uroot mytinytodo -N \
-e "SELECT SUBSTRING(param_value,1,150) FROM mtt_settings WHERE param_key='config.json';"
{"url": "", "mtt_url": "", "title": "myTinyTodo", "lang": "en", "password": "sha256:13a5c202e320d0b
⚠️ 注意:
password键存的是sha256:<十六进制摘要>。实测验证算法:printf 'q1w2e3r4' | sha256sum输出13a5c202e320d0bf9bb2c6e2c7cf380a6f7de5d392509fee260b809c893ff2f9,与库内值逐字符一致——即「明文口令的无盐 SHA-256」。这意味着知道库内容即可离线暴力破解弱口令,请勿在多人可读的数据库上使用弱口令。
3.4 数据库直改(仅两类合法场景)
正常运维一律走 Web 界面;只有两种场景需要直接改库:
-
忘记管理口令无法登录:把
password键清空(应用回到无口令开放状态),再用界面重新设置。实测(MariaDB 后端):mysql -uroot mytinytodo \ -e "UPDATE mtt_settings SET param_value = JSON_SET(param_value, '$.password', '') WHERE param_key='config.json';"执行后
param_value中"password": "sha256:13a5c..."变为"password": ""(实测回显见上一步对比),首页立即免登录可访问(HTTP 200 直接出任务列表)。SQLite 后端写法:UPDATE settings SET param_value = JSON_SET(param_value, '$.password', '') WHERE param_key='config.json'; -
修改界面未暴露的参数(如
duedateformat,见 5.5 节):JSON_SET 精确改单个键。
改库后无需重启服务,下一次页面请求即生效。
四、参数总览
4.1 数据库连接层(config.php 常量)
| 常量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
MTT_DB_TYPE | string | 向导生成 | 数据库类型:sqlite / mysql / postgres |
MTT_DB_HOST | string | localhost | 数据库主机(SQLite 下不生效) |
MTT_DB_USER | string | mtt | 数据库用户(SQLite 下不生效) |
MTT_DB_PASSWORD | string | mtt | 数据库口令(SQLite 下不生效) |
MTT_DB_NAME | string | mytinytodo | 数据库名(SQLite 下不生效) |
MTT_DB_PREFIX | string | ''(SQLite)/ mtt_(MySQL 向导默认) | 数据表前缀 |
MTT_DB_DRIVER | string | '' | 指定 MySQL 具体 API:mysqli 或留空用 PDO |
MTT_SALT | string | 向导随机生成(UUID 形态) | 会话与令牌派生盐,不可随意变更 |
4.2 应用行为层(config.json 键)
| 键 | 类型 | 默认值 | 取值范围 | 界面入口 |
|---|---|---|---|---|
| url | string | '' | URL 字符串 | 无(index.php 从非安装目录调用时使用) |
| mtt_url | string | '' | 目录 URL(尾斜杠) | 无(同上) |
| title | string | '' | 任意 | 标题输入框 |
| lang | string | en | 36 语言代码(zh-cn/zh-tw/en…) | Language 下拉框 |
| password | string | '' | '' 或 sha256:<hex> | Password 单选+输入框 |
| smartsyntax | int | 1 | 0/1 | Smart Syntax 单选 |
| timezone | string | UTC | PHP 时区名 | Timezone 下拉框 |
| autotag | int | 1 | 0/1 | Auto tag 单选 |
| duedateformat | int | 1 | 1(y-m-d)/2(m/d/y)/3(d.m.y) | 无界面入口(隐藏参数) |
| firstdayofweek | int | 1 | 0–6 | First day of week 下拉框 |
| clock | int | 24 | 12/24 | Clock 下拉框 |
| dateformat | string | j M Y | PHP date() 格式 | Date format 输入框 |
| dateformat2 | string | n/j/y | 同上 | Short date format 输入框 |
| dateformatshort | string | j M | 同上 | 输入框 |
| showdate | int | 0 | 0/1 | 单选 |
| showtime | int | 0 | 0/1 | 复选框 |
| showdateInline | int | 0 | 0/1 | 复选框 |
| exactduedate | int | 0 | 0/1 | 单选 |
| markup | string | markdown | markdown / v1 | 单选(markdown 1/0 映射) |
| appearance | string | system | system/light/dark | 单选 |
| newTaskCounter | int | 0 | 0/1 | 复选框 |
| newTaskCounterIcon | int | 0 | 0/1 | 复选框 |
| extensions | array | [] | 已启用扩展 ID 数组 | 设置页扩展管理区 |
4.3 清单级参数(每张清单独立,存 lists 表)
| 字段 | 类型 | 默认 | 说明(实测自 API 响应) |
|---|---|---|---|
| sorting | int | 0 | 清单内排序方式(拖拽手动/按优先级/按截止日等) |
| published | int | 0 | 1=发布清单(允许输出 RSS feed.php) |
| showCompl | int | 1 | 是否显示已完成任务 |
| showNotes | int | 0 | 列表页是否直接展示备注 |
| hidden | int | 0 | 1=隐藏清单(内置 All tasks 清单 hidden=1) |
| feedKey | string | '' | RSS 访问键(发布后生成) |
五、核心参数分类详解
5.1 数据库连接参数(config.php)
安装向导生成的 SQLite 形态(实测):
define('MTT_DB_TYPE', 'sqlite');
define('MTT_DB_HOST', 'localhost');
define('MTT_DB_USER', 'mtt');
define('MTT_DB_PASSWORD', 'mtt');
define('MTT_DB_NAME', 'mytinytodo');
define('MTT_DB_PREFIX', '');
define('MTT_DB_DRIVER', '');
define('MTT_SALT', '0fdd0165-c40c-499d-bf6c-755c6e48ce48');
切换 MySQL 后向导重新生成的形态(实测):
define('MTT_DB_TYPE', 'mysql');
define('MTT_DB_HOST', 'localhost');
define('MTT_DB_USER', 'mtt');
define('MTT_DB_PASSWORD', 'mtt');
define('MTT_DB_NAME', 'mytinytodo');
define('MTT_DB_PREFIX', 'mtt_');
define('MTT_DB_DRIVER', '');
define('MTT_SALT', 'b90e53cf-9fb1-4418-b076-aec1cf8ef2e8');
逐项解读:
MTT_DB_TYPE:三选一。SQLite 后端时 HOST/USER/PASSWORD/NAME 四项是占位值不参与连接(代码在 sqlite 分支直接用文件路径)。改类型不要手编此文件——向导除了写文件还会校验连接与建表,直接删掉config.php重跑setup.php才是完整路径。MTT_DB_PREFIX:表名前缀。MySQL 向导默认mtt_(实测建出mtt_lists/mtt_todolist等 6 张表),SQLite 向导留空(表名即lists/todolist)。同一库内多套 myTinyTodo 实例共表时用前缀区分。MTT_DB_DRIVER:留空走 PDO(class.db.mysql.php),填mysqli强制走 MySQLi API(class.db.mysqli.php),仅在宿主 PHP 缺 pdo_mysql 时使用。MTT_SALT:随机盐,参与会话 ID 与 API 令牌的签名派生(代码中idSignature()以key.salt拼接)。变更后果:所有已登录会话与已签发的 API Token 立即失效,用户需重新登录;因此除安全事件处置外不要动它。
5.2 站点标识与访问控制
title:站点名,显示在页面标题与列表头。实测设为myTinyTodo。password:唯一的应用级访问控制。三种状态语义(源码注释与实测一致):''= 无保护,所有人可读写;sha256:<hex>= 全功能口令(读写均可)。界面上的 allowpassword=0 单选等价于把库内password清空。口令校验函数isPasswordEqualsToHash()只认sha256前缀算法,改库时若手写其他算法前缀会直接抛Unsupported algo of password hash异常。url/mtt_url:仅在把index.php挪到别的调用路径时需要(例如经包装脚本从http://site.com/todo.php调用),常规部署保持空串。
5.3 本地化参数
lang:界面语言,实测下拉共 36 项(ar/bg/ca/zh-cn/zh-tw/cz/da/nl/en/et/fr/de/el/he/hu/it/ja/lt/mk/no/fa/pl/pt-br/pt-pt/ro/ru/sr/sk/sl/es/es-mx/sv/th/tr/uk/vi)。语言包为 JSON 文件,位于应用目录includes/lang/(实测含zh-cn对应的中文包)。timezone:任务时间戳的显示时区,取值必须能通过 PHPnew DateTimeZone()校验(非法值会被静默忽略——settings.php 源码实测逻辑:捕获异常后不保存)。firstdayofweek:日历组件周起始日,0=周日 … 6=周六,默认 1(周一)。clock:12/24 小时制,影响时间显示与截止时间选择器。dateformat/dateformat2/dateformatshort:三组 PHPdate()格式串,分别是任务完整日期、紧凑日期、超短日期。改串时注意 settings.php 会removeNewLines(),不能含换行。
5.4 任务录入参数
smartsyntax:智能语法开关。开启后新建任务标题支持±priority Task #Tag1 #Tag2 @duedate一行式解析。实测样例:输入+1 采购牛奶 #home @2026-10-26,API 返回的任务记录为prio=1、标题采购牛奶、标签 home、截止日 2026-10-26(一次输入四项全解析)。autotag:自动打标签开关。开启时在已选中某标签过滤的视图里新建任务会自动带上该标签。markup:备注渲染引擎。markdown(默认,CommonMark 渲染,实测支持**加粗**等语法)/v1(v1.6 时代的旧语法,保留兼容)。界面上「Markdown」单选 1/0 分别映射这两个值。
5.5 显示参数
showdate/showtime/showdateInline:任务行的日期显示三开关——是否显示创建日期、是否带时间、是否内联在标题行(而非另起一行)。exactduedate:截止日期是否精确到时分(开启后日期选择器出现时间部分)。appearance:system(跟随系统亮暗)/light/dark,实测三选一。newTaskCounter/newTaskCounterIcon:未读新任务计数,前者显示在页面角标,后者写进浏览器标签页 favicon 位置。duedateformat:界面未暴露的隐藏参数(4.2 表唯一无 UI 入口的键)。源码注释明确三档语义:1=y-m-d(默认)、2=m/d/y、3=d.m.y,作用于截止日期选择器的日历格式。需要时用 3.4 节的 JSON_SET 直改。
5.6 扩展管理参数(extensions)
extensions 是已启用扩展 ID 的数组。应用自带扩展包 ext/extensions.tar.gz(实测解包清单)含 4 个扩展:
| 扩展 ID | 名称 | 功能 |
|---|---|---|
| backup | Backup v1.2.1 | 从界面发起配置+数据库备份与恢复下载 |
| CustomCSS | Custom CSS | 注入自定义 CSS(官方还提供了德语本地化) |
| notifications | Notifications | 任务通知(内置 Telegram 发送通道与 CLI 触发脚本 cli-notify.php) |
| updater | Updater | 在线检查更新 |
启用方式:设置页扩展区点启用/停用,应用把扩展 ID 写回 extensions 数组(如 ["backup"])。注意扩展目录 ext/ 需保持可读——4 个扩展随主包分发,无需额外下载。
5.7 清单级参数
每张清单(lists 表一行,API GET /lists 实测响应字段)独立的参数:sorting(排序方式,拖拽排序时按 ow 手动序)、published(1=发布,允许 feed.php 输出 RSS——未发布的清单请求 RSS 会得到 Access denied!<br> List is not published. 实测报错)、showCompl、showNotes、hidden(内置 All tasks 虚拟清单 hidden=1 且不可删)、feedKey(发布后生成的 RSS 访问键)。修改入口为界面清单右键菜单或 API PUT /lists/<id>。
六、生产配置模板
场景 A:个人轻量主机(2 vCPU / 2GB 内存 / 40GB 盘,单用户,Nginx + PHP-FPM + SQLite)——最常见形态,直接采用安装默认值即可,无需改 config.php;只需在界面做如下一次设置(对应 config.json 实测模板):
{
"title": "我的待办",
"lang": "zh-cn",
"password": "sha256:13a5c202e320d0bf9bb2c6e2c7cf380a6f7de5d392509fee260b809c893ff2f9",
"smartsyntax": 1,
"timezone": "Asia/Shanghai",
"autotag": 1,
"markup": "markdown",
"firstdayofweek": 1,
"clock": 24,
"dateformat": "j M Y",
"appearance": "system",
"extensions": ["backup"]
}
要点:口令必设(示例为 q1w2e3r4 的 sha256 值,实际部署请用你自己的口令生成);语言与时区本地化;启用 backup 扩展便于界面一键备份 SQLite 文件。此场景资源占用可忽略(PHP-FPM 默认 5 个 max_children 已远超单用户需求)。
场景 B:已有 MariaDB 的团队服务器(4 vCPU / 8GB 内存,几人共用)——config.php 关键项:
define('MTT_DB_TYPE', 'mysql');
define('MTT_DB_HOST', 'localhost');
define('MTT_DB_USER', 'mtt');
define('MTT_DB_PASSWORD', 'mtt');
define('MTT_DB_NAME', 'mytinytodo');
define('MTT_DB_PREFIX', 'mtt_');
要点:数据库账号按 6.2 节最小授权(仅 mytinytodo.*);MTT_DB_PASSWORD 示例为演示值,生产环境换成强口令(该值只写进 root 可读的 config.php,644 属主 www-data);多人共用时仍共享同一个口令(应用无账号体系),不要把 myTinyTodo 当权限隔离工具用。
七、常见问题(FAQ)
Q1:改了 config.php 里的参数为什么不生效?
因为站点标题、语言、口令这类行为参数根本不存 config.php——它们在数据库 config.json 里(见 3.1 两层体系表)。config.php 只管数据库连接与盐。改行为参数请走 settings.php。
Q2:忘记管理口令怎么办?
按 3.4 节实测路径:数据库直改 config.json 的 password 键为空串 → 首页立即免登录 → 进 settings.php 重新设口令。SQLite 命令:UPDATE settings SET param_value = JSON_SET(param_value, '$.password', '') WHERE param_key='config.json';(MariaDB 表名为 mtt_settings,其余相同)。
Q3:改了 MTT_SALT 会怎样? 所有会话与 API Token 失效(盐参与签名派生),所有人被登出;数据本身无损。除口令泄露类安全处置外不建议变更。
Q4:向导/界面里没有的 duedateformat 怎么改? 见 5.5 节:它是源码注册但界面未暴露的隐藏参数,用 3.4 节 JSON_SET 直改(合法取值 1/2/3)。
Q5:直接改库安全吗?
只改 settings 表 config.json 键、且用 JSON_SET 精确改单键时安全(实测通过)。整块覆写 JSON 时注意保留全部键与合法取值——非法时区会被忽略、非法口令算法前缀会让登录直接抛异常。
Q6:换了语言/时区部分任务时间看起来不对?
检查 timezone 是否保存成功(非法值被静默忽略,界面看似保存实则维持 UTC 默认),以及任务列表的 showtime/showdate 开关组合是否符合预期。
八、参考链接
- 官方仓库(源码即参数定义):https://github.com/maxpozdeev/mytinytodo
- 参数注册表源码:仓库内
includes/class.config.php - 安装篇(两层配置的生成过程):《Ubuntu 22.04 安装 myTinyTodo 1.8.6 指南》
- API 篇(清单级参数的 API 读写):《myTinyTodo 1.8.6 API 使用详解》