一键备份+跨主机传输!PHP全自动网站备份脚本,零依赖超省心
侧边栏壁纸
  • 累计撰写 15 篇文章
  • 累计收到 1 条评论

一键备份+跨主机传输!PHP全自动网站备份脚本,零依赖超省心

vous
2026-05-13 / 0 评论 / 1 阅读 / 正在检测是否收录...

对于站长和开发者来说,网站数据备份是保障资产安全的最后一道防线。手动备份不仅繁琐耗时,还容易遗漏文件或数据库,一旦服务器故障、误操作删库,数据丢失的损失难以估量。

今天给大家分享一款纯PHP编写、零依赖、开箱即用的全自动备份脚本,无需安装任何软件,只需简单配置,就能一键备份网站全部文件+数据库,并自动通过FTP传输到另一台虚拟主机,实现异地容灾备份,彻底告别数据丢失风险。

一、脚本核心优势

这款备份脚本专为虚拟主机/轻量服务器环境设计,完美解决新手站长备份难、传输难的问题,核心亮点:

  1. 零依赖纯PHP:无需宝塔、无需系统命令,支持所有PHP运行环境,上传即用;
  2. 双备份全覆盖:自动备份网站所有文件 + MySQL数据库,一键打包;
  3. 异地传输安全:备份完成后自动通过FTP上传到另一台主机,本地不留临时文件;
  4. 容错性强:数据库配置错误、数据库信息为空,自动跳过并提示;
  5. 自动清理:备份、上传完成后自动删除本地临时文件,不占用服务器空间;
  6. 简单配置:仅需填写数据库和FTP信息,小白也能快速上手。

二、脚本完整代码(可直接复制使用)

<?php
// ==========================================
// 配置区:请根据面板信息填写以下内容
// ==========================================
$config = [
    // 本地数据库配置(当前A虚拟主机的数据库信息)
    'db_host'  => 'localhost',   // 数据库地址,一般固定为localhost
    'db_name'  => '',            // 填写:数据库名
    'db_user'  => '',            // 填写:数据库用户名
    'db_pass'  => '',            // 填写:数据库密码

    // 目标FTP配置(要备份到的B虚拟主机FTP信息)
    'ftp_host' => '',            // 填写:FTP服务器IP地址
    'ftp_port' => 21,            // FTP端口,默认21无需修改
    'ftp_user' => '',            // 填写:FTP用户名
    'ftp_pass' => '',            // 填写:FTP密码
    'ftp_dir'  => '/',           // FTP上传目录,默认/无需修改
];

// 运行配置
ini_set('display_errors', 0);
error_reporting(0);
ini_set('max_execution_time', '600');
ini_set('memory_limit', '1G');

// 路径
$webRoot = __DIR__;
$backupDir = $webRoot . '/_backup';
@mkdir($backupDir, 0755, true);
$time = date('Ymd_His');
$zipFile = $backupDir . "/backup_$time.zip";
$sqlFile = $backupDir . "/db_$time.sql";
$includeDatabase = false;

// ---------------------------
// 数据库备份(可失败,不中断)
// ---------------------------
if (!empty($config['db_name']) && !empty($config['db_user'])) {
    $mysqli = @new mysqli($config['db_host'], $config['db_user'], $config['db_pass'], $config['db_name']);
    if ($mysqli->connect_error) {
        echo "数据库信息错误,跳过数据库备份,仅打包网站文件\n";
    } else {
        $mysqli->set_charset('utf8mb4');
        $tables = @$mysqli->query("SHOW TABLES");
        if ($tables) {
            $sqlContent = "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n";
            while ($row = $tables->fetch_row()) {
                $table = $row[0];
                $create = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_row()[1];
                $sqlContent .= "DROP TABLE IF EXISTS `$table`;\n$create;\n\n";
                $data = $mysqli->query("SELECT * FROM `$table`");
                while ($item = $data->fetch_assoc()) {
                    $values = array_map([$mysqli, 'real_escape_string'], $item);
                    $sqlContent .= "INSERT INTO `$table` VALUES ('" . implode("','", $values) . "');\n";
                }
                $sqlContent .= "\n\n";
            }
            file_put_contents($sqlFile, $sqlContent);
            $includeDatabase = true;
        }
    }
} else {
    echo "数据库信息为空,跳过数据库备份,仅打包网站文件\n";
}

// ---------------------------
// 打包网站文件
// ---------------------------
$zip = new ZipArchive();
if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
    die("压缩包创建失败,目录无权限或空间不足");
}

if ($includeDatabase && file_exists($sqlFile)) {
    $zip->addFile($sqlFile, basename($sqlFile));
}

function addDirToZip($root, $dir, $zip) {
    $handle = opendir($dir);
    while (($file = readdir($handle)) !== false) {
        if ($file == '.' || $file == '..' || $file == basename(__FILE__) || strpos($dir, '_backup') !== false) continue;
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
            addDirToZip($root, $path, $zip);
        } else {
            $zip->addFile($path, str_replace($root . '/', '', $path));
        }
    }
    closedir($handle);
}
addDirToZip($webRoot, $webRoot, $zip);
$zip->close();

// 删除临时SQL
if (file_exists($sqlFile)) {
    unlink($sqlFile);
}

// ---------------------------
// FTP 上传
// ---------------------------
if (empty($config['ftp_host']) || empty($config['ftp_user'])) {
    delDir($backupDir);
    die("FTP信息未填写,无法上传");
}

$ftpConn = @ftp_connect($config['ftp_host'], $config['ftp_port']);
if (!$ftpConn) {
    delDir($backupDir);
    die("FTP连接失败,请检查FTP地址和端口");
}

if (!@ftp_login($ftpConn, $config['ftp_user'], $config['ftp_pass'])) {
    ftp_close($ftpConn);
    delDir($backupDir);
    die("FTP登录失败,请检查用户名和密码");
}

ftp_set_option($ftpConn, FTP_USEPASVADDRESS, false);
ftp_pasv($ftpConn, true);

if (!@ftp_chdir($ftpConn, $config['ftp_dir'])) {
    ftp_close($ftpConn);
    delDir($backupDir);
    die("FTP目录切换失败,目录不存在");
}

if (!@ftp_put($ftpConn, basename($zipFile), $zipFile, FTP_BINARY)) {
    ftp_close($ftpConn);
    delDir($backupDir);
    die("文件上传失败,无写入权限或空间已满");
}

ftp_close($ftpConn);

// 删除临时目录
function delDir($dir) {
    if (!is_dir($dir)) return;
    foreach (scandir($dir) as $file) {
        if ($file == '.' || $file == '..') continue;
        $path = $dir . '/' . $file;
        is_dir($path) ? delDir($path) : unlink($path);
    }
    rmdir($dir);
}
delDir($backupDir);

// 成功提示
echo "任务执行完成,文件已上传至目标主机\n";
if ($includeDatabase) {
    echo "已包含网站文件 + 数据库\n";
} else {
    echo "仅包含网站文件(数据库未备份)\n";
}
?>

三、使用教程(5分钟配置完成)

1. 准备工作

  • 准备当前网站的数据库信息(主机、库名、用户名、密码,虚拟主机面板可查看);
  • 准备接收备份的主机FTP信息(IP、用户名、密码、端口,默认21);
  • 将脚本保存为backup.php,上传到网站根目录(和index.php同级)。

2. 核心配置

打开脚本,找到配置区,仅需修改以下参数:

// 本地数据库配置
'db_name'  => '你的数据库名',
'db_user'  => '你的数据库用户名',
'db_pass'  => '你的数据库密码',

// 目标FTP配置
'ftp_host' => 'FTP服务器IP',
'ftp_user' => 'FTP用户名',
'ftp_pass' => 'FTP密码',

其他参数默认即可,无需修改。

3. 执行备份

  • 浏览器访问:你的域名/backup.php(例如:https://xxx.com/backup.php);
  • 等待脚本执行,页面会显示执行结果;
  • 成功后,备份文件会自动上传到目标FTP主机,本地无残留文件。

四、脚本执行流程详解

  1. 环境初始化:设置脚本超时时间、内存限制,创建临时备份目录;
  2. 数据库备份:自动连接MySQL,导出所有数据表结构和数据,生成SQL文件;
  3. 文件打包:递归遍历网站所有文件,排除脚本自身和临时目录,打包为ZIP压缩包;
  4. FTP传输:自动连接目标FTP服务器,上传压缩包,支持被动模式(兼容绝大多数主机);
  5. 自动清理:上传完成后删除本地SQL文件和临时目录,释放服务器空间;
  6. 结果提示:清晰展示备份结果,告知是否包含数据库、传输是否成功。

五、常见问题解决

1. 压缩包创建失败

  • 原因:网站目录无写入权限,或服务器空间不足;
  • 解决:给网站根目录设置755权限,清理服务器冗余文件。

2. FTP连接/上传失败

  • 原因:FTP信息填写错误、端口被拦截、目标主机空间不足;
  • 解决:核对FTP信息,开启被动模式(脚本已默认配置),检查目标主机空间。

3. 数据库备份失败

  • 原因:数据库信息错误、数据库连接限制;
  • 解决:核对数据库账号密码,确认数据库地址为localhost

4. 脚本执行超时

  • 解决:脚本已默认设置10分钟超时,大网站可将max_execution_time改为1200

六、进阶使用建议

  1. 定时自动备份:结合虚拟主机的计划任务(Corn),每天/每周自动执行脚本,实现无人值守备份;
  2. 多主机备份:配置多组FTP信息,可将备份同时上传到多个主机,双重保障;
  3. 备份文件管理:在目标FTP主机创建专门的备份目录,按时间分类存储,方便回溯;
  4. 安全防护:备份完成后可删除脚本,或修改脚本文件名,避免未授权访问。

总结

数据安全是网站运营的重中之重,这款PHP全自动备份脚本,用最简单的方式解决了站长最核心的备份需求。无需专业技术,无需额外成本,上传配置即可使用,真正实现网站文件+数据库一键备份、异地传输、自动清理

0

评论 (0)

取消