
本文将解决在使用 Dompdf 生成大量 PDF 文件时遇到的超时问题。通过分析常见原因,提出了从 Web 服务器环境迁移到命令行环境,并配合 set_time_limit 函数来规避超时限制的解决方案。同时,探讨了如何将 Web 页面的选择传递给命令行脚本,以实现批量 PDF 生成的需求,以实现批量 PDF 生成的需求。
当使用 Dompdf 在 Web 环境中生成大量 PDF 文件时,很容易遇到超时问题,这是因为 Web 服务器对脚本的执行时间有限制。例如,原问题中提到的生成 500+ PDF 文件,每个 PDF 文件包含多页内容,很容易触发 PHP 的 max_execution_time 限制以及 Web 服务器(如 Apache 或 IIS)的超时设置。解决这个问题,需要从根本上改变 PDF 生成的方式。
1. 切换到命令行环境 (CLI)
Web 服务器主要处理 HTTP 请求,并不适合长时间运行的任务。将 PDF 生成任务迁移到命令行环境,可以绕过 Web 服务器的超时限制,并获得更多的系统资源。
2. 使用 set_time_limit(0) 延长执行时间
在 CLI 脚本中,可以使用 set_time_limit(0) 函数来取消 PHP 的最大执行时间限制。这将允许脚本无限制地运行,直到完成所有 PDF 文件的生成。
<?php
set_time_limit(0); // 取消时间限制
require_once 'vendor/autoload.php'; // 引入 Dompdf
use Dompdf\Dompdf;
// 假设 $finalItems 是需要生成 PDF 的数据数组
$finalItems = ['item1', 'item2', 'item3', /* ... */];
foreach ($finalItems as $item) {
// 模拟从数据库获取数据
$saleData = getSaleData($item);
$purchaseData = getPurchaseData($item);
$stock_trf = getStockTransferData($item);
$res = array_merge($saleData, $purchaseData, $stock_trf);
// 创建 Dompdf 实例
$dompdf = new Dompdf();
// 加载 HTML 模板
$html = generateHtmlFromData($res); // 替换为你的 HTML 生成逻辑
$dompdf->loadHtml($html);
// (可选) 设置纸张大小和方向
$dompdf->setPaper('A3', 'landscape');
// 渲染 PDF
$dompdf->render();
// 保存 PDF 文件
$output = $dompdf->output();
$filename = 'item_' . $item . '.pdf';
file_put_contents('pdf/' . $filename, $output);
echo "Generated: " . $filename . "\n";
}
echo "PDF generation complete!\n";
// 辅助函数 (需要根据实际情况实现)
function getSaleData($item) { /* ... */ }
function getPurchaseData($item) { /* ... */ }
function getStockTransferData($item) { /* ... */ }
function generateHtmlFromData($data) { /* ... */ }
?>注意事项:
3. 将 Web 页面的选择传递给 CLI 脚本
如果需要在 Web 页面上选择需要生成 PDF 的项目,需要将这些选择传递给 CLI 脚本。 可以通过以下几种方式实现:
例如,使用文件传递参数:
Web 页面 (PHP):
<?php
// 假设 $selectedItems 是用户选择的项目数组
$selectedItems = ['item1', 'item2', 'item3'];
// 将项目列表写入 JSON 文件
file_put_contents('selected_items.json', json_encode($selectedItems));
// 执行 CLI 脚本
$command = 'php generate_pdf.php'; // 替换为你的 CLI 脚本路径
exec($command . ' > /dev/null 2>&1 &'); // 在后台运行,不阻塞 Web 请求
echo "PDF generation started in the background.\n";
?>CLI 脚本 (generate_pdf.php):
<?php
set_time_limit(0);
require_once 'vendor/autoload.php';
use Dompdf\Dompdf;
// 从 JSON 文件读取项目列表
$selectedItems = json_decode(file_get_contents('selected_items.json'), true);
if ($selectedItems === null) {
echo "Error: Could not read selected items from file.\n";
exit(1);
}
foreach ($selectedItems as $item) {
// ... (PDF 生成逻辑,同上例) ...
}
?>注意事项:
4. 其他优化技巧
总结
通过将 PDF 生成任务迁移到命令行环境,并配合 set_time_limit(0) 函数,可以有效地解决使用 Dompdf 生成大量 PDF 文件时遇到的超时问题。 同时,需要考虑如何将 Web 页面的选择传递给 CLI 脚本,并进行适当的优化,以提高生成效率和稳定性。 这种方法适用于需要批量生成 PDF 文件,且对实时性要求不高的场景。
以上就是使用 Dompdf 一键生成大量 PDF 文件:优化方案与实践的详细内容,更多请关注php中文网其它相关文章!
全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号