You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击浏览器关闭按钮时自动备份数据库

解决方案

要实现仅在浏览器关闭时触发数据库备份,核心是区分页面关闭和站内跳转/表单提交两种场景,以下是具体实现步骤:

1. 封装备份逻辑为独立PHP接口

将你现有的备份代码保存为backup_db.php,建议加入会话验证防止未授权调用:

<?php
session_start();
// 验证用户登录状态(根据你的实际会话字段调整)
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    exit;
}

$databases = ['laligacafe']; // Database name
$user = "root";
$pass = "";
$host = "localhost";

date_default_timezone_set('Africa/Cairo');

$baseDir = "C:/xampp/htdocs/LaLigaCafe/assets/sql_backups";
if (!file_exists($baseDir)) {
    mkdir($baseDir);
}

foreach ($databases as $database) {
    $dbDir = "$baseDir/$database";
    if (!file_exists($dbDir)) {
        mkdir($dbDir);
    }

    $filename = $database . "_" . date("F_d_Y") . "@" . date("g_ia") . uniqid("_", false);
    $filePath = "$dbDir/$filename.sql";

    exec("C:/xampp/mysql/bin/mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$filePath}", $output);
}
?>

2. 前端JS区分页面关闭与站内操作

在你的页面中添加以下JS代码,通过标记区分场景,仅在页面关闭时发送备份请求:

// 标记是否为页面关闭操作(默认是)
let isPageClosing = true;

// 监听站内链接点击:点击同域跳转链接时,标记为非关闭操作
document.addEventListener('click', function(e) {
    const target = e.target.closest('a');
    if (target && target.origin === window.location.origin) {
        isPageClosing = false;
    }
});

// 监听表单提交:提交站内表单时,标记为非关闭操作
document.addEventListener('submit', function() {
    isPageClosing = false;
});

// 监听页面卸载事件
window.addEventListener('beforeunload', function() {
    if (isPageClosing) {
        // 使用navigator.sendBeacon发送请求,避免浏览器取消异步请求
        navigator.sendBeacon('backup_db.php');
    }
});

关键说明

  • navigator.sendBeacon的优势:相比普通AJAX,它专门用于页面卸载时发送数据,浏览器会确保请求完成,不会因页面关闭被中断。
  • 会话验证:在backup_db.php中加入会话验证,防止未登录用户或恶意请求触发备份。
  • 备份耗时限制:若数据库数据量较大,直接在卸载事件中执行备份可能超时,建议改为异步队列处理(比如用后台脚本定期执行或触发队列任务)。

内容的提问来源于stack exchange,提问作者Hazem Behairy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:45:59