myTinyTodo 1.8.6 配置参数详解

myTinyTodo 1.8.6 两层配置体系详解:config.php 的 8 个 MTT_* 常量与数据库 config.json 的 24 个键逐一说明(类型/默认值/取值/入口),含扩展管理、清单级参数、忘记口令的 JSON_SET 恢复实测与生产配置模板。

myTinyTodoPHP 应用自托管任务管理2026/10/24

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.php8 个 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 界面;只有两种场景需要直接改库:

  1. 忘记管理口令无法登录:把 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';

  2. 修改界面未暴露的参数(如 duedateformat,见 5.5 节):JSON_SET 精确改单个键。

改库后无需重启服务,下一次页面请求即生效。

四、参数总览

4.1 数据库连接层(config.php 常量)

常量类型默认值说明
MTT_DB_TYPEstring向导生成数据库类型:sqlite / mysql / postgres
MTT_DB_HOSTstringlocalhost数据库主机(SQLite 下不生效)
MTT_DB_USERstringmtt数据库用户(SQLite 下不生效)
MTT_DB_PASSWORDstringmtt数据库口令(SQLite 下不生效)
MTT_DB_NAMEstringmytinytodo数据库名(SQLite 下不生效)
MTT_DB_PREFIXstring''(SQLite)/ mtt_(MySQL 向导默认)数据表前缀
MTT_DB_DRIVERstring''指定 MySQL 具体 API:mysqli 或留空用 PDO
MTT_SALTstring向导随机生成(UUID 形态)会话与令牌派生盐,不可随意变更

4.2 应用行为层(config.json 键)

键类型默认值取值范围界面入口
urlstring''URL 字符串无(index.php 从非安装目录调用时使用)
mtt_urlstring''目录 URL(尾斜杠)无(同上)
titlestring''任意标题输入框
langstringen36 语言代码(zh-cn/zh-tw/en…)Language 下拉框
passwordstring'''' 或 sha256:<hex>Password 单选+输入框
smartsyntaxint10/1Smart Syntax 单选
timezonestringUTCPHP 时区名Timezone 下拉框
autotagint10/1Auto tag 单选
duedateformatint11(y-m-d)/2(m/d/y)/3(d.m.y)无界面入口(隐藏参数)
firstdayofweekint10–6First day of week 下拉框
clockint2412/24Clock 下拉框
dateformatstringj M YPHP date() 格式Date format 输入框
dateformat2stringn/j/y同上Short date format 输入框
dateformatshortstringj M同上输入框
showdateint00/1单选
showtimeint00/1复选框
showdateInlineint00/1复选框
exactduedateint00/1单选
markupstringmarkdownmarkdown / v1单选(markdown 1/0 映射)
appearancestringsystemsystem/light/dark单选
newTaskCounterint00/1复选框
newTaskCounterIconint00/1复选框
extensionsarray[]已启用扩展 ID 数组设置页扩展管理区

4.3 清单级参数(每张清单独立,存 lists 表)

字段类型默认说明(实测自 API 响应)
sortingint0清单内排序方式(拖拽手动/按优先级/按截止日等)
publishedint01=发布清单(允许输出 RSS feed.php)
showComplint1是否显示已完成任务
showNotesint0列表页是否直接展示备注
hiddenint01=隐藏清单(内置 All tasks 清单 hidden=1)
feedKeystring''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:任务时间戳的显示时区,取值必须能通过 PHP new DateTimeZone() 校验(非法值会被静默忽略——settings.php 源码实测逻辑:捕获异常后不保存)。
  • firstdayofweek:日历组件周起始日,0=周日 … 6=周六,默认 1(周一)。
  • clock:12/24 小时制,影响时间显示与截止时间选择器。
  • dateformat / dateformat2 / dateformatshort:三组 PHP date() 格式串,分别是任务完整日期、紧凑日期、超短日期。改串时注意 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名称功能
backupBackup v1.2.1从界面发起配置+数据库备份与恢复下载
CustomCSSCustom CSS注入自定义 CSS(官方还提供了德语本地化)
notificationsNotifications任务通知(内置 Telegram 发送通道与 CLI 触发脚本 cli-notify.php)
updaterUpdater在线检查更新

启用方式:设置页扩展区点启用/停用,应用把扩展 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 开关组合是否符合预期。

八、参考链接