当用户点击导出按钮时,我们不希望用户等待数据导出的整个过程,因为这可能会很长时间,导致页面超时或者用户体验下降。所以,我们采用异步处理的方式来完成这个任务。这就像是你去餐厅点了一份需要很长时间烹饪的食物,服务员不会让你在厨房等待,而是给你一个号码,食物准备好后会叫你。在这里,“号码”就像是后续通知你的方式。
具体步骤如下:
- 用户点击导出按钮:用户在网页上点击一个按钮,请求导出数据。
- 服务器接收请求:服务器收到请求,但不是立刻导出数据,而是记录这个请求,并告诉用户请求已收到。
- 后台处理:服务器后台有一个程序会检查这些请求,并开始处理数据导出。
- 导出数据:后台程序从数据库中获取数据,并生成一个Excel文件。
- 通知用户:文件准备好后,服务器通知用户,并提供下载链接。
PHP实例代码
以下是一个简化的示例来说明整个过程:
1. 前端按钮
HTML页面上的导出按钮:
<button onclick="exportData()">导出表格</button> <script> function exportData() { // 发送请求到服务器 fetch('/export_request.php', { method: 'POST' }) .then(response => response.text()) .then(data => { alert('导出请求已提交!'); console.log(data); // 可以显示服务器返回的信息 }); } </script>2. 服务器接收请求 (export_request.php)
<?php // 记录导出请求(这里简化为写入文件) file_put_contents('export_queue.txt', time() . "\n", FILE_APPEND); echo "导出请求已收到,正在为您准备文件!"; ?>这里我们只是简单地将当前时间戳写入一个文件作为导出请求的记录。
3. 后台处理脚本 (export_processor.php)
这个脚本需要定期运行,比如使用cron job。
<?php require 'vendor/autoload.php'; // 引入PhpSpreadsheet库 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PDO; // 检查任务队列 if (file_exists('export_queue.txt')) { $requests = file('export_queue.txt', FILE_IGNORE_NEW_LINES); foreach ($requests as $requestTime) { // 从数据库获取数据 $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $stmt = $pdo->query("SELECT * FROM your_table"); // 替换为你的查询 $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // 创建Excel文件 $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'ID'); // 设置表头,根据需要修改 $sheet->setCellValue('B1', 'Name'); // ...以及其他表头 $row = 2; foreach ($data as $row_data) { $sheet->setCellValue('A' . $row, $row_data['id']); // 填充数据,根据数据库字段修改 $sheet->setCellValue('B' . $row, $row_data['name']); // ...以及其他数据 $row++; } // 保存Excel文件 $writer = new Xlsx($spreadsheet); $filename = "export_$requestTime.xlsx"; // 使用时间戳作为文件名的一部分,避免重复 $writer->save($filename); // 通知用户(这里简化为输出到控制台,实际应用中可能是发送邮件或更新数据库等) echo "文件已准备好:$filename\n"; // 从队列中移除已处理的任务...(省略了这部分代码) } } ?>注意:你需要先通过Composer安装PhpSpreadsheet库,并根据你的数据库配置修改PDO连接信息。此外,这个脚本应该通过cron job或其他任务调度器定期运行。
通俗解释
想象一下你在一个餐厅,点了一份制作时间很长的美食。服务员不会让你在厨房等,而是记录你的点单并给你一个号码牌。你可以在餐厅里等待或做其他事情。当食物准备好时,服务员会根据你的号码牌找到你并送上食物。这就是异步处理。在我们的例子中,点击导出按钮就像是你点餐,服务器后台处理就像是厨师在厨房准备食物,通知用户就像是服务员根据号码牌找到你送上食物。