我花了一段时间处理使用 DomPDF 的非常缓慢的 PDF 生成过程。经过大量的摆弄和谷歌搜索,我最终得到了一个解决方案,我想我会发布该解决方案,以防你们中的一些人正在处理同样的问题。
问题:我管理的电子商务网站具有允许卖家下载 PDF 文件的功能,其中包含他们已完成的采购订单(基本上是向买家显示的购买确认的副本)。这一直工作正常。当我部署了一项附加功能以允许卖家下载单个PDF 文件时,问题就开始了,其中包含在用户定义的一组日期之间生成的所有采购订单。当需要导出为单个 PDF(每页一个)的采购订单数量超过 20-30 时,该过程变得非常缓慢(如 30-60 秒)。
从数据库中获取数据并解析它不是问题。构建后来导出到 PDF 的视图也不是问题(即使有数百个订单,将 HTML 输出到屏幕也只需要几分之一秒),所以我基本上确定 dompdf 是问题所在。
设置如下: 1.- MySQL 数据库 2.- 应用服务器:多个负载均衡的 PHP+Nginx+PHP-fpm 实例运行 linux 3.- PHP 7.2 4.- dompdf 0.82(最新的) 5.- Codeigniter 3.0.9 6.- 用于格式化布局的 Bootstrap
目标是允许在可接受的时间内在单个 PDF 中下载多个(可能是数百个)采购订单。
我在我的 pdf 中显示了一些问题答案。但在某些情况下,上一页的问题和答案会出现在下一页。我想避免这种情况。我想在第一页或下一页的同一页中显示问题和答案。我试过CSS
如下:
.questiontext
{
unbreakable: true
}
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用。请帮助我。我添加了 pdf 帮助程序并查看页面如下。
$d_arr=date('Y-m-d H:i:s');
$location_name="test"
$list_content=$this->generate_form_list($submission_id,$client_id);
$filename_proposalpdf="formname.pdf";
$this->load->helper(array('dompdf', 'file'));
pdf_create_proposal($list_content,$filename_proposalpdf,true);
Run Code Online (Sandbox Code Playgroud)
在生成表单列表中,我添加了如下视图页面:
public function generate_form_list($id,$client_id)
{
$data['form_data']=$this->Mobile_app_model->get_form_list($id,$client_id);
$data['client_data']=$this->Mobile_app_model->get_client_data($client_id);
$data['client_idsss']=$client_id;
return $this->load->view('pdf_formlist',$data,true);
}
Run Code Online (Sandbox Code Playgroud)
在视图页面中,我已经显示了如下数据:
<?php
foreach($task_data as $fdata)
{
echo '<p class="questiontext">';echo $fdata['question_text'];echo '</p>';
echo '<p id="lableanswer">';echo $fdata['answer'];echo '</p>';echo '<br/>';
}
?>
Run Code Online (Sandbox Code Playgroud)
请帮助我如何使两者都在一页中。
我开始收到这个错误
遇到 PHP 错误严重性:8192
消息:函数 Redis::setTimeout() 已弃用
文件名:drivers/Session_redis_driver.php
我正在使用 PHP 7.2.27 我能做些什么来解决这个问题