首先,我们要明白异步任务的概念。异步任务是指,在执行某个操作时,不会阻塞后续代码的执行,即允许其他代码在等待某个可能耗时的任务完成时继续运行。
在PHP中,我们可以通过命令行(CLI)模式来执行异步任务。这通常是通过在服务器上设置一个cron job(定时任务)或使用类似nohup的命令来实现的。
底层原理
- 命令行模式:PHP不仅可以在Web服务器上运行,还可以在命令行中运行。在命令行模式中,PHP脚本可以像其他任何程序一样被直接调用和执行。
- 异步执行:通过使用如
nohup或screen等工具,我们可以在后台运行PHP脚本,这样即使你关闭了终端或SSH连接,脚本也会继续运行。 - Excel导出:PHP可以通过一些库(如PhpSpreadsheet)来创建和导出Excel文件。这些库允许你构建Excel表格,填充数据,并将其保存为文件。
通俗解释
想象一下,你有一个大厨房(服务器),里面有一个厨师(PHP脚本)。通常,厨师会按照你给的菜谱(代码)一步步做菜(执行任务)。但有时候,某些步骤(如炖汤)需要很长时间,而你不想一直站在那里等。所以,你告诉厨师:“你继续炖汤,我先去玩会儿,炖好了叫我。”(这就是异步任务)。
现在,把这个场景应用到Excel导出上。导出大Excel文件就像炖一大锅汤,需要时间。你不希望你的网站或应用因为等待导出而卡住,所以你就告诉PHP:“你去后台慢慢导出,我先去做其他事情。”(使用命令行模式的异步执行)。
实例代码
- 安装PhpSpreadsheet
使用Composer来安装PhpSpreadsheet库:
composer require phpoffice/phpspreadsheet编写导出脚本(
export_excel.php):<?php require 'vendor/autoload.php'; // 引入PhpSpreadsheet库 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 创建一个新的Excel文档 $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // 填充数据到Excel中(这里只是示例数据) $sheet->setCellValue('A1', 'Hello'); $sheet->setCellValue('B1', 'World!'); // ... 可以继续添加更多数据和格式设置等 ... // 保存Excel文件到某个目录(例如:/tmp/exported_excel.xlsx) $writer = new Xlsx($spreadsheet); $writer->save('/tmp/exported_excel.xlsx');- 在命令行中异步执行:
使用
nohup命令来在后台运行脚本,并将输出重定向到一个文件以防止任何控制台活动:nohup php export_excel.php > output.log 2>&1 &这条命令会在后台启动
export_excel.php脚本,并将标准输出和标准错误都重定向到output.log文件中。这样,即使你关闭了终端,导出任务也会继续执行。
4.检查导出的Excel文件:当脚本执行完毕后,你可以到
/tmp/exported_excel.xlsx路径下找到导出的Excel文件。同时,output.log文件会记录脚本的执行情况,包括任何可能发生的错误或警告。