php远程备份文件夹需依赖外部协议或api,推荐rsync+ssh增量同步,或phpseclib纯php实现sftp;务必排除动态文件、校验完整性、处理权限,并先用--dry-run测试。

PHP 本身不提供直接“远程备份文件夹”的内置功能,所有远程操作都依赖外部协议(如 SFTP、FTP、rsync)或第三方服务 API。用 exec() 或 shell_exec() 调用系统命令是最常见、最可控的方式;纯 PHP 实现(如 phpseclib)适合无 shell 权限但需精细控制的场景。
用 rsync + SSH 做增量同步(推荐 Linux 服务器)
rsync 是最稳妥的远程文件夹备份方案,支持断点续传、压缩传输、排除规则和硬链接去重。前提是目标服务器开通 SSH,且 PHP 进程有执行 shell 命令权限(exec() 未被禁用)。
- 确保 PHP 运行用户(如
www-data)能免密登录目标主机:在 Web 服务器上生成密钥对,把公钥追加到远程~/.ssh/authorized_keys - 命令示例(带排除和压缩):
rsync -avz --delete --exclude='cache/' --exclude='logs/' /var/www/myapp/ user@192.168.1.100:/backup/myapp_$(date +\%Y\%m\%d)/
- PHP 中调用需注意:路径含空格或特殊字符时必须用
escapeshellarg()包裹;rsync返回非 0 码表示失败,务必检查$return_var - 不要在生产环境用 root 执行;避免在
$_GET参数里拼接路径,防止命令注入
用 phpseclib 实现纯 PHP SFTP 备份(适合共享主机)
当无法启用 exec()(如多数虚拟主机),phpseclib 是可靠替代。它纯 PHP 实现 SSH2/SFTP,无需扩展,但上传大文件时内存占用高、速度慢于原生命令。
- 安装:
composer require phpseclib/phpseclib - SFTP 连接后,不能直接“复制整个目录”,需递归遍历本地目录,逐个
$sftp->put()文件;目录需提前$sftp->mkdir() - 注意时区和时间戳:SFTP 默认不保留修改时间,需手动调用
$sftp->chmod()和$sftp->touch()(如果支持) - 大文件建议分块读写,避免超内存:用
fopen('ssh2.sftp://...')流方式比put($content)更稳
备份前必须处理的 3 个关键点
无论用哪种方式,忽略这些会导致备份无效或泄露敏感数据。
立即学习“PHP免费学习笔记(深入)”;
-
排除动态文件:如
wp-content/cache/、storage/logs/、.env、config/database.php—— 这些不是代码资产,而是运行时产物或密钥 -
校验完整性:远程写入后,至少比对文件数(
find /local -type f | wc -lvs$sftp->nlist()递归计数);关键文件可加 MD5 校验 -
权限与所有权:SFTP 上传的文件默认属主是登录用户,不是 Web 服务器用户;若需恢复,得提前规划
chown或用rsync --chown
真正难的不是“怎么传过去”,而是“传什么、传完怎么确认、出错怎么回滚”。很多线上事故源于备份脚本漏了 vendor/ 或误删了远程旧备份。建议首次运行前,先用 --dry-run(rsync)或 echo 替代实际上传,看日志是否符合预期。











