温馨提示×

Linux环境下ThinkPHP如何备份

小樊
43
2025-11-18 19:21:14
栏目: 编程语言

Linux环境下备份ThinkPHP的可执行方案

一 备份策略与准备

  • 建议采用“代码+数据库”双备份:代码用tar.gz归档,数据库用mysqldump导出为**.sql**。
  • 准备一个备份目录(如:/data/backup/your_project/),并确保运行备份的用户对该目录有读写权限,同时该用户具备数据库读取权限
  • 为安全起见,避免在代码中硬编码数据库密码,优先使用环境变量或配置文件读取敏感信息。

二 方案一 快速命令行备份(适合临时或手动)

  • 备份代码目录(示例):
    cd /var/www
    sudo tar -czvf your_project_$(date +%F_%H-%M-%S).tar.gz your_project_directory
    
  • 备份数据库(示例):
    mysqldump -h 127.0.0.1 -u dbuser -p dbname > db_backup_$(date +%F_%H-%M-%S).sql
    
  • 说明:将dbuserdbname替换为实际值,执行后按提示输入密码。以上命令可直接在服务器上运行,适合快速手工备份。

三 方案二 ThinkPHP自定义命令备份(可集成与自动化)

  • 生成命令文件:在app/command/Backup.php创建备份命令
    <?php
    namespace app\command;
    
    use think\console\Command;
    use think\console\Input;
    use think\console\Output;
    use think\facade\Db;
    
    class Backup extends Command
    {
        protected function configure()
        {
            $this->setName('backup')->setDescription('Database backup command');
        }
    
        protected function execute(Input $input, Output $output)
        {
            $cfg = Db::getConfig();
            $host = $cfg['hostname'] ?? '127.0.0.1';
            $port = $cfg['hostport'] ?? 3306;
            $user = $cfg['username'];
            $pass = $cfg['password'];
            $db   = $cfg['database'];
    
            $backupDir = runtime_path() . 'backup/';
            if (!is_dir($backupDir)) mkdir($backupDir, 0755, true);
    
            $file = $backupDir . 'backup_' . date('Y-m-d_H-i-s') . '.sql';
    
            // 注意:-p后不要有空格,出于安全建议从环境变量读取密码
            $cmd = sprintf(
                'mysqldump -h%s -P%s -u%s -p%s %s > %s',
                escapeshellarg($host),
                escapeshellarg($port),
                escapeshellarg($user),
                escapeshellarg($pass),
                escapeshellarg($db),
                escapeshellarg($file)
            );
    
            $output->writeln("Starting backup: {$file}");
            exec($cmd, $lines, $ret);
            if ($ret === 0) {
                $output->writeln("Backup succeeded: {$file}");
            } else {
                $output->error("Backup failed, exit code: {$ret}");
                foreach ($lines as $l) $output->writeln($l);
            }
        }
    }
    
  • 注册命令:在config/console.php中添加
    return [
        'commands' => [
            'app\command\Backup',
        ],
    ];
    
  • 执行与验证:
    php think backup
    ls -lh runtime/backup/
    
  • 安全建议:将数据库密码放入环境变量(如 DB_PASS),在命令中用escapeshellarg处理参数,避免密码出现在进程列表。

四 自动化与恢复

  • 定时自动备份(crontab):
    # 每天 02:00 备份数据库到 runtime/backup/
    0 2 * * * /usr/bin/php /var/www/your_project backup >> /var/log/backup.log 2>&1
    
    # 每周日 03:00 打包整个项目目录到 /data/backup/
    0 3 * * 0 cd /var/www && tar -czf /data/backup/your_project_$(date +\%F).tar.gz your_project_directory
    
  • 数据库恢复(示例):
    mysql -h 127.0.0.1 -u dbuser -p dbname < /path/to/backup_2025-11-18_10-00-00.sql
    
  • 备份文件管理:建议保留近7–31天,可编写清理脚本定期删除过期备份,避免磁盘占满。

0