spatie/laravel-backup安装失败或命令未定义,主因是Laravel/PHP版本不匹配、服务提供者未注册、配置未发布、mysqldump缺失或权限不足、ZIP内存超限;需严格对照版本兼容表,手动注册Provider(旧版)、发布配置、设置dump路径、改用tar打包并限制备份范围。

composer require spatie/laravel-backup 装不上?先确认 Laravel 版本和 PHP 版本对得上
spatie/laravel-backup 不是“装了就能用”的包,版本不匹配直接报错 require 失败或安装后 php artisan backup:run 报 Class not found。它对 Laravel 和 PHP 有明确约束:Laravel 10+ 需要 v8.x,Laravel 9 对应 v7.x,PHP 至少 8.0(v8.x 要求 PHP 8.1+)。运行 php -v 和 php artisan --version 看清底子再动手。
- 查当前 Laravel 版本:
php artisan --version - 查当前 PHP 版本:
php -v - 查对应关系:去 GitHub 上看
spatie/laravel-backup的README.md顶部 “Version Compatibility” 表格,别信第三方教程写的“最新版通用” - 如果 Laravel 是 9.51、PHP 是 8.0.2,就只能装
composer require spatie/laravel-backup:^7.0,硬上 v8 会卡在 autoload 生成阶段
装完 php artisan backup:run 报 Command "backup:run" is not defined
这是典型的服务提供者没注册或配置没发布。Laravel 5.5+ 支持自动发现,但前提是你的 composer.json 里没禁用 extra.laravel.dont-discover,且 config/app.php 没手动删掉 Spatie\Backup\BackupServiceProvider::class(Laravel 10 已默认移除该文件,全靠自动发现)。
- Laravel 10:确保
composer.json中没有"dont-discover": ["*"]或类似写法;装完立刻跑composer dump-autoload - Laravel 9 及更早:如果用了自动发现,仍报错,手动加一行到
config/app.php的providers数组:Spatie\Backup\BackupServiceProvider::class - 无论哪个版本,都必须运行
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider",否则config/backup.php不会出现,命令也加载不了
备份数据库时提示 DatabaseDumpFailed,mysqldump 命令找不到或权限不对
spatie/laravel-backup 默认调用系统级的 mysqldump(MySQL)或 pg_dump(PostgreSQL),不是用 Laravel 的 DB 连接去导出。所以即使 .env 里数据库连得通,mysqldump 也可能根本不在 $PATH 里,或者用户没权限读取 socket 文件。
- 先在终端执行
which mysqldump,如果空白,说明没装或没加进 PATH;Ubuntu/Debian 通常要装mysql-client包,CentOS/RHEL 是mariadb - Mac M1/M2 用户常见问题:
mysqldump在 Homebrew 安装的 MySQL 路径下(如/opt/homebrew/bin/mysqldump),需把该路径加进PATH,或在config/backup.php的'database_dump_binary_path'里写死完整路径 - Linux 服务器若用 socket 连接(
DB_SOCKET=/var/run/mysqld/mysqld.sock),确保运行php artisan backup:run的系统用户(比如 www-data)对该 socket 文件有读权限,否则报Can't connect to local MySQL server
备份大文件或慢存储时超时、内存溢出
默认配置下,spatie/laravel-backup 用 ZipArchive 打包,所有文件读进内存再压缩,遇到几十 GB 的 uploads 目录或 NFS 存储,很容易触发 Allowed memory size exhausted 或 Maximum execution time exceeded。
- 关掉 ZIP,改用
tar:在config/backup.php中设'use_tar' => true,它流式打包,不占 PHP 内存 - 限制单次备份大小:用
'only_files' => ['storage/app']明确指定目录,别用'include' => ['/']这种危险写法 - 调整 PHP 运行限制:CLI 模式下,
php.ini的memory_limit和max_execution_time是独立于 web 的,别只改了www.conf - 生产环境别在
App\Console\Kernel里用schedule直接跑backup:run,建议改用backup:clean+backup:run分两步,并加withoutOverlapping()防重叠
真正麻烦的从来不是“怎么装”,而是备份路径跨磁盘、目标存储挂载失败、或者凌晨三点备份卡住导致后续任务全堵住——这些得靠日志和监控兜底,而不是依赖 backup:run 的返回码。











