网站数据要随时存一份。备份做得好,出问题能原样找回,不用慌。

能做什么

  • 一键备份数据库,也能连同上传文件一起打包。
  • 备份文件可以下载、删除,也能用来恢复。
  • 可以按计划自动备份,不用天天手动点。
  • 恢复前系统会自动再存一份,留个后路。

手动备份怎么做

  1. 登录后台,进入「系统设置 → 数据备份」页。
  2. 点一键备份。需要连上传文件一起存,就勾选「连同上传文件」。
  3. 备份完成后,列表里会出现一条记录,包含文件名、类型、大小、SHA256、来源、创建人和时间。
  4. 要下载就点「下载」,文件以附件形式输出,只有登录管理员能访问,并会写入审计日志。

备份文件保存在 data/backups/,这个目录在站点根目录 public/ 之外,首次备份时自动创建。文件名带时间戳和随机部分,不能靠猜地址下载。

数据库备份默认压缩,保存为 .sqlite.gz。可以在「系统设置 → 数据备份」里关闭「压缩备份文件」,关闭后保存为未压缩的 .sqlite。

恢复怎么做

  1. 在列表里展开「恢复」,输入站点名称或「确认」。
  2. 系统先校验所选文件,校验失败会拒绝恢复。
  3. 校验通过后,系统自动生成一份「恢复前」备份。
  4. 用备份里的数据覆盖当前数据库,保留当前的数据库结构。
  5. 恢复完成后清除全部登录会话,所有管理员需要重新登录。

恢复会覆盖当前数据,请在低峰期操作,并确认选择的是正确的备份。

定时备份怎么设

在「系统设置 → 数据备份」里配置:

设置项默认值说明
自动备份间隔每天可选关闭、每天、每周(每周在周一执行)
执行时间03:15按站点时区执行,格式 HH:MM
最多保留备份份数15超出后自动删除最旧的定时备份;手动备份与「恢复前」备份不会自动删除
压缩备份文件开启数据库备份存为 .sqlite.gz;关闭后存为未压缩的 .sqlite
自动整理数据库每周可选关闭、每周;只在 cron:run 里执行 VACUUM
整理星期周日按站点时区计算
整理执行时间03:45按站点时区执行,格式 HH:MM
整理后优化统计开启整理完成后执行 PRAGMA optimize

定时备份只备份数据库,不包含上传文件。调度器每分钟由 cron:run 检查一次是否到期,同一天(或同一周)只执行一次。

配置调度器

把 /var/www/kingcms 和 PHP 路径换成服务器上的实际路径,建议每分钟运行一次。

系统 crontab

* * * * * /usr/bin/php /var/www/kingcms/bin/kingcms cron:run >> /var/www/kingcms/data/cron.log 2>&1

用运行网站的用户(通常是 www-data)配置,避免生成的文件属主不对:

sudo -u www-data crontab -e

systemd service + timer

/etc/systemd/system/kingcms-cron.service:

[Unit]
Description=KingCMS 定时任务

[Service]
Type=oneshot
User=www-data
ExecStart=/usr/bin/php /var/www/kingcms/bin/kingcms cron:run

/etc/systemd/system/kingcms-cron.timer:

[Unit]
Description=每分钟运行 KingCMS 定时任务

[Timer]
OnCalendar=*:0/1
Persistent=true

[Install]
WantedBy=timers.target

启用:

sudo systemctl daemon-reload
sudo systemctl enable --now kingcms-cron.timer

宝塔面板

在「计划任务」新建 Shell 脚本任务,执行周期选「N 分钟」并填 1,脚本内容与上面的 crontab 命令相同。保存后手动运行一次,确认没有报错。

虚拟主机

使用主机商提供的「定时任务」或「Cron Jobs」功能,按分钟执行上面的命令。不能执行 Shell 的主机无法使用自动备份,只能手动在后台备份。

Windows 任务计划程序

新建任务,触发器选「每天」并勾选「重复任务间隔 1 分钟」、持续时间「无限期」;操作选「启动程序」:

C:\php\php.exe C:\kingcms\x1\bin\kingcms cron:run

起始于填写 C:\kingcms。

确认是否在运行

「系统设置 → 数据备份」页显示:

  • 上次运行:调度器最近一次执行 cron:run 的时间。
  • 上次自动备份:最近一次定时备份的创建时间。
  • 数据库文件大小 / 可回收空间 / 上次整理:数据库占用与整理结果;点「立即整理」可手动加入整理队列。

调度器超过 10 分钟没有运行,或者从未运行过,页面顶部会出现黄色警告条。

整理数据库

删除数据后,SQLite 文件不会自动变小。每周整理会执行 VACUUM,把文件重写为紧凑的副本;整理后如果开启「整理后优化统计」,还会执行 PRAGMA optimize。

  • 整理只由命令行调度器 cron:run 执行,web 请求不会直接执行 VACUUM。
  • 整理前如果 24 小时内没有成功备份,会先自动创建一份定时备份;自动备份失败时跳过本次整理。
  • 拿不到整理锁或数据库被占用时跳过并写日志,下个周期再试。
  • 点「立即整理」并确认后,只会把整理任务加入队列,由调度器在后台执行。
  • 每次整理都会写入审计日志,动作为 backup.vacuum。

整理期间会占用数据库写锁,建议安排在低峰时段。数据库较大时整理需要更长时间。

要单独备份的文件

app.key 不包含在备份里。它用于解密设置中的密钥字段,换服务器或重装系统时请单独备份 data/app.key,否则数据库里的 DeepSeek 密钥、支付私钥、接口密钥等无法解密。

常见故障

  • 上次运行一直不更新:先在命令行手动执行 php bin/kingcms cron:run 看报错;确认 crontab 里的 PHP 路径正确,并且执行用户对 data/ 有写权限。
  • 命令找不到 PHP:用 which php 或 command -v php 查出绝对路径再填进 crontab。
  • 备份失败:检查磁盘空间与 data/ 权限;备份目录需要可写、可创建。提示未启用 sqlite3 扩展时,安装 PHP 的 sqlite3 扩展并重启 PHP-FPM。
  • 执行时间不对:「执行时间」按站点时区计算,修改「系统设置 → 设置 → 站点基本 → 基本信息」中的站点时区后以下次运行为准。
  • 连同媒体打包失败:服务器需要启用 PHP 的 zip 扩展。上传目录不存在时只打包数据库。
  • 日志位置:crontab 里把输出重定向到 data/cron.log 后在此查看;宝塔面板的「计划任务」里也可以查看执行日志;PHP-FPM 或 Web 服务器的错误日志会记录备份异常。

相关文档:系统设置、安装、升级。