温馨提示×

Ubuntu如何备份PHP项目

小樊
33
2025-11-18 21:53:28
栏目: 编程语言

Ubuntu下备份PHP项目的实用方案

一 备份范围与准备

  • 明确需要备份的内容:
    • 项目代码目录(如:/var/www/your_project
    • 数据库(如:MySQL/MariaDBPostgreSQL
    • 环境与依赖配置(如:.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
    • 项目敏感与环境文件:.env.htaccess、自定义配置等
  • 恢复步骤
    • 代码:解压覆盖到目标目录
      • 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 nginxsudo systemctl reload apache2
  • 验证
    • 检查站点首页、登录、关键业务接口是否正常
    • 核对数据库记录数、附件与媒体资源是否完整

0