Ubuntu如何备份PHP项目
导读:Ubuntu下备份PHP项目的实用方案 一 备份范围与准备 明确需要备份的内容: 项目代码目录(如:/var/www/your_project) 数据库(如:MySQL/MariaDB 或 PostgreSQL) 环境与依赖配置(如:....
Ubuntu下备份PHP项目的实用方案
一 备份范围与准备
- 明确需要备份的内容:
- 项目代码目录(如:/var/www/your_project)
- 数据库(如:MySQL/MariaDB 或 PostgreSQL)
- 环境与依赖配置(如:.env、.htaccess、框架配置、Web 与 PHP 配置)
- 准备备份存放位置(示例:/opt/backups/php),并确保运行备份的用户对该目录有写权限。
- 建议将备份与 Web 目录分离,避免被 Web 直接访问;必要时设置目录权限为仅管理员可读写。
二 方案一 Shell脚本一键备份(推荐)
- 创建备份脚本(示例:/opt/backups/backup_php.sh)
#!/usr/bin/env bash
set -Eeuo pipefail
# 配置
PROJECT_DIR="/var/www/your_project" # 项目根目录
BACKUP_DIR="/opt/backups/php" # 备份存放目录
DB_HOST="localhost"
DB_USER="dbuser"
DB_PASS="dbpass"
DB_NAME="dbname"
RETENTION_DAYS=30
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 时间前缀
TS=$(date +"%Y%m%d_%H%M%S")
LOG="$BACKUP_DIR/backup_$TS.log"
# 备份数据库(MySQL/MariaDB)
DB_DUMP="$BACKUP_DIR/${
DB_NAME}
_${
TS}
.sql.gz"
echo "[$(date)] Dumping database $DB_NAME to $DB_DUMP" >
>
"$LOG"
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" \
| gzip >
"$DB_DUMP" || {
echo "DB backup failed";
exit 1;
}
# 备份项目文件
CODE_TAR="$BACKUP_DIR/${
PROJECT_DIR##*/}
_${
TS}
.tar.gz"
echo "[$(date)] Archiving project $PROJECT_DIR to $CODE_TAR" >
>
"$LOG"
tar -czf "$CODE_TAR" -C "$(dirname "$PROJECT_DIR")" "$(basename "$PROJECT_DIR")" >
>
"$LOG" 2>
&
1
# 清理过期备份
echo "[$(date)] Cleaning up backups older than $RETENTION_DAYS days" >
>
"$LOG"
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
echo "[$(date)] Backup finished. See $LOG for details."
- 赋权并测试
chmod +x /opt/backups/backup_php.sh
/opt/backups/backup_php.sh
- 加入定时任务(每天 02:00 执行)
sudo crontab -e
# 添加
0 2 * * * /opt/backups/backup_php.sh
- 说明
- 使用 mysqldump --single-transaction 可在不锁表的情况下获得一致性快照(InnoDB 推荐)。
- 如需备份 PostgreSQL,可用 pg_dump 生成 SQL 转储,再与代码一起打包归档。
三 方案二 使用PHP脚本实现备份与定时
- 适用场景:共享主机或无系统级工具权限时,可用 PHP 完成文件打包与数据库导出。
- 示例(文件 + MySQL,含日志与保留策略)
<
?php
declare(strict_types=1);
set_time_limit(300);
$backupDir = '/opt/backups/php';
$projectDir = '/var/www/your_project';
$host = 'localhost';
$user = 'dbuser';
$pass = 'dbpass';
$name = 'dbname';
$retentionDays = 7;
$ts = date('Ymd_His');
$logFile = "$backupDir/backup_$ts.log";
file_put_contents($logFile, "Start at " . date('c') . "\n", FILE_APPEND);
function run(string $cmd, string $label, string $logFile): void {
exec($cmd . ' 2>
&
1', $out, $code);
file_put_contents($logFile, "[$label] exit=$code\n" . implode("\n", $out) . "\n", FILE_APPEND);
if ($code !== 0) exit(1);
}
// 数据库导出
$sqlFile = "$backupDir/{
$name}
_$ts.sql.gz";
run("mysqldump -h$host -u$user -p$pass --single-transaction --routines --triggers $name | gzip >
'$sqlFile'", 'DB Dump', $logFile);
// 代码打包
$tarFile = "$backupDir/" . basename($projectDir) . "_$ts.tar.gz";
run("tar -czf '$tarFile' -C '" . dirname($projectDir) . "' '" . basename($projectDir) . "'", 'Code Archive', $logFile);
// 清理旧备份
run("find '$backupDir' -type f -name '*.sql.gz' -mtime +$retentionDays -delete", 'Cleanup SQL', $logFile);
run("find '$backupDir' -type f -name '*.tar.gz' -mtime +$retentionDays -delete", 'Cleanup Code', $logFile);
file_put_contents($logFile, "Finished at " . date('c') . "\n", FILE_APPEND);
echo "OK: $sqlFile, $tarFile\n";
- 定时执行(系统计划任务)
sudo crontab -e
# 每天 02:00 用 CLI 执行
0 2 * * * /usr/bin/php /opt/backups/backup.php
- 安全建议
- 将数据库凭据放入受控位置(如受保护目录的配置文件或环境变量),避免硬编码在 Web 可访问路径。
- 生成的备份文件权限建议设为 600,仅所有者可读写。
四 备份Web与PHP配置及恢复步骤
- 备份配置(建议纳入同一备份任务)
- PHP 配置:先定位 php.ini
- 命令:
php --ini | grep "Loaded Configuration File" | awk '{ print $4} ' - 备份:
sudo cp /etc/php/8.1/cli/php.ini /etc/php/8.1/cli/php.ini.bak
- 命令:
- Web 服务器
- Nginx:
/etc/nginx/nginx.conf、/etc/nginx/sites-available/your-site - Apache:
/etc/apache2/apache2.conf、/etc/apache2/sites-available/your-site.conf
- Nginx:
- 项目敏感与环境文件:
.env、.htaccess、自定义配置等
- PHP 配置:先定位 php.ini
- 恢复步骤
- 代码:解压覆盖到目标目录
tar -xzf your_project_YYYYMMDD_HHMMSS.tar.gz -C /var/www/
- 数据库:导入 SQL 转储
gunzip < your_db_YYYYMMDD_HHMMSS.sql.gz | mysql -h localhost -u dbuser -p dbname
- 配置:将备份的 php.ini、Nginx/Apache 配置与项目 .env 等恢复到原路径并重启服务
sudo systemctl reload nginx或sudo systemctl reload apache2
- 代码:解压覆盖到目标目录
- 验证
- 检查站点首页、登录、关键业务接口是否正常
- 核对数据库记录数、附件与媒体资源是否完整
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu如何备份PHP项目
本文地址: https://pptw.com/jishu/751302.html
