本文摘要 DeepSeek
该 PHP 脚本实现了一个网站备份工具,主要功能包括:1. 通过 POST 请求接收备份 URL 和保留份数;2. 验证 URL 有效性后,从目标服务器获取备份文件;3. 下载并保存到本地,同时删除旧备份以控制数量;4. 通知源服务器删除已备份文件。脚本包含错误处理机制,会返回 JSON 格式的操作结果。适用于站长通过宝塔面板定时执行备份任务,实现自动化网站数据保护。核心流程为:请求验证→文件获取→本地存储→清理旧文件→远程删除,确保备份高效且存储可控。
目标网站上传握手文件,设置本地保留文件份数,也可以挂宝塔计划任务定时执行备份,站长备份利器
核心代码:
// 处理备份设置
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['bfurl']) && isset($_POST['number']) && isset($_SESSION['authenticated'])) {
$backupUrl = $_POST['bfurl'];
$backupCount = intval($_POST['number']);
// 验证备份 URL 格式
if (!filter_var($backupUrl, FILTER_VALIDATE_URL)) {
$errorMessage = "请输入有效的 URL,需包含 http 或 https。";
} else {
// 移除 URL 末尾的 /,确保后续拼接正确
$cleanedBackupUrl = rtrim($backupUrl, '/');
// 服务器 A 的备份脚本 URL
$serverAUrl = $cleanedBackupUrl . '/backup.php';
// 发起请求获取备份文件
$backupFile = @file_get_contents($serverAUrl, false, $context);
if ($backupFile === false) {
$error = error_get_last();
$errorMessage = "请检查 backup.php 文件是否已上传至 $cleanedBackupUrl 根目录";
error_log("无法从 $serverAUrl 获取备份文件");
} else {
if (!strpos($backupFile, '无法创建备份文件')) {
// 检查备份目录是否可写
$backupDir = __DIR__;
if (!is_writable($backupDir)) {
$errorMessage = "备份目录不可写: ". $backupDir;
error_log("备份目录不可写: ". $backupDir);
} else {
// 下载备份文件
$serverABackupUrl = $cleanedBackupUrl . '/' . $backupFile;
$backupFilePath = $backupDir . '/' . $backupFile;
$downloaded = @file_put_contents($backupFilePath, @file_get_contents($serverABackupUrl, false, $context));
if ($downloaded === false) {
$error = error_get_last();
$errorMessage = "下载备份文件失败";
error_log("未能下载备份文件");
} else {
// 获取备份目录下所有的备份文件
$backupFiles = glob($backupDir . '/backup_*.zip');
usort($backupFiles, function ($a, $b) {
return filemtime($b) - filemtime($a);
});
// 只保留最近的指定数量份备份文件
if (count($backupFiles) > $backupCount) {
$filesToDelete = array_slice($backupFiles, $backupCount);
foreach ($filesToDelete as $file) {
if (!unlink($file)) {
$error = error_get_last();
error_log("多余备份文件删除失败");
}
}
}
// 向服务器 A 发送删除请求
$serverBUrl = $cleanedBackupUrl . '/backup.php';
$deleteUrl = $serverBUrl . '?file=' . urlencode($backupFile);
$ch = curl_init($deleteUrl);
// 设置 curl 超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
$error = curl_error($ch);
$errorMessage = "向服务器发送删除请求失败";
error_log("未能发送删除请求");
} else {
$backupSuccess = true;
}
curl_close($ch);
}
}
} else {
$errorMessage = "备份失败";
}
}
}
// 处理完成后返回 JSON
header('Content-Type: application/json');
if ($backupSuccess) {
echo json_encode(['status' => 'success', 'message' => '备份成功,请刷新页面查看备份文件!']);
} else {
echo json_encode(['status' => 'error', 'message' => $errorMessage]);
}
exit;
}