编程

Laravel Backup v10: 可序列化事件、弹性多目的地备份及更多功能

7 2026-04-22 15:14:00

我们刚刚发布了 laravel-backup 的 v10 版本,这是我们的一个包,用于为你的 Laravel 应用创建备份。备份是一个 zip 文件,其中包含你指定的目录中的所有文件,以及数据库的转储文件。你可以将它存储在 Laravel 支持的任何文件系统中,甚至可以一次备份到多个磁盘。

我们最初创建这个包是在 DigitalOcean 导致我们的一台服务器宕机之后。那次经历让我们深刻认识到,绝不能完全依赖托管服务提供商进行备份。自那以后,我们一直在积极维护这个包。

执行备份

安装好软件包后,执行备份只需运行:

php artisan backup:run

此操作会将你已配置的文件和数据库打包为 ZIP 归档,并将其存储在你指定的磁盘上。你也可以选择仅备份数据库或仅备份文件:

php artisan backup:run --only-db
php artisan backup:run --only-files

或者指定磁盘

php artisan backup:run --only-to-disk=s3

在大多数配置中,你会希望这样调度。请在 routes/console.php 文件中进行设置:

In most setups you'll want to schedule this. In your routes/console.php:

use Illuminate\Support\Facades\Schedule;

Schedule::command('backup:run')->daily()->at('01:00');

罗列及监控备份

若要查看所有备份的概览,请运行:

php artisan backup:list

此处展示了一张表格,列出了每次备份的名称、所在磁盘、日期及大小。

该包还附带了一个监控组件,用于检查备份的健康状况。当备份文件过于陈旧,或备份文件的总大小超过预设阈值时,该备份即被视为处于“不健康”状态。

php artisan backup:monitor

通常,你会将监视器设置为每日运行:

Schedule::command('backup:monitor')->daily()->at('03:00');

当监控器检测到问题时,它会触发一个事件,进而触发通知。该软件包开箱即支持邮件、Slack、Discord,以及(v10 版本新增的)通用 Webhook 通道。

清楚旧备份

随着时间的推移,备份文件会逐渐堆积。该软件包包含一条清理命令,可根据可配置的保留策略移除旧的备份。

php artisan backup:clean

默认策略会在指定天数内保留所有备份;随后,它将仅保留每日备份中的一份、每周备份中的一份,以此类推。该策略绝不会删除最新的那份备份。你需要将此策略与你的备份命令一同进行调度:

Schedule::command('backup:clean')->daily()->at('02:00');

v10 有什么新特性

v10 版本主要致力于响应社区长期以来的需求,并对内部架构进行清理与优化。

最大的变化在于:现在所有的事件都直接携带基础数据(即 string $diskNamestring $backupName),而不再携带 BackupDestination 对象。这意味着事件现在可以配合队列监听器(Queued Listeners)使用——这在之前是无法实现的,因为那些对象并不支持序列化。如果你现有的代码中包含自定义的事件监听器,你需要对其进行更新,将原本的 $event->backupDestination->diskName() 调用替换为 $event->diskName

事件(Events)与通知(Notifications)现已实现解耦。无论是否使用了 --disable-notifications 标志,事件都会被正常触发。这修复了一个此前存在的缺陷:当通知功能被禁用时,BackupWasSuccessful 事件将无法触发;而由于加密功能依赖于 BackupZipWasCreated 事件,这一缺陷曾导致加密功能也随之失效。

针对多目标备份场景,新增了一个名为 continue_on_failure 的配置选项。启用该选项后,即使某个备份目标(Destination)发生故障,也不会导致整个备份任务中断。系统会针对该故障目标触发相应的失败事件,随后继续执行剩余目标的备份任务。

其他新增功能包括:verify_backup 配置选项,用于在 ZIP 归档文件创建完成后对其进行完整性校验;通用的 Webhook 通知通道,支持 Mattermost、Teams 以及各类自定义服务的集成;新增的命令行选项(如 --filename-suffix--exclude--destination-path);以及经过优化的健康检查机制——现在它能够报告所有的故障项,而不再像旧版本那样在遇到首个故障时便立即中止检查。

在内部架构层面,单例模式的 ConsoleOutput 类已被替换为 backupLogger() 辅助函数;加密相关的配置项现已改用规范的枚举类型(Enum)进行管理;此外,storage/framework 目录默认已被排除在备份范围之外。

关于所有破坏性变更(Breaking Changes)的详细列表及迁移指南,请参阅官方的升级文档