如何实现点击浏览器关闭按钮时自动备份数据库
解决方案
要实现仅在浏览器关闭时触发数据库备份,核心是区分页面关闭和站内跳转/表单提交两种场景,以下是具体实现步骤:
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
相关产品推荐
相关产品推荐

