我该怎么做才能创建大型PDF文件而不出错?

时间:2011-04-11 08:27:45

标签: php pdf

我正在使用数据库中的fpdf创建一个pdf文件,但是当我的数据库中存在大量数据时,文件无法完全创建,只有一半文件出来,或者什么都不会发生或者我得到运行时错误我该怎么做才能创建大型PDF文件而不会出错?

大pdf:

代码如下:

require('lib\fpdf.php');
require ('lib\pdf.php');
include ('lib\bukaDb.php');

$pdf = new PDF('P','pt','A4');
$pdf->SetFont('Arial','',8);
$pdf->AliasNbPages();
$pdf->Open();
$pdf->setY($pdf->tMargin);

for ($i=0; $i<count($var); $i++){   
//Do something , show data
//$pdf->Ln(20);
}

// Finally, produce the PDF!!

$pdf->Output();

我的表有几百行,我不能使用设置时间限制功能,还有其他推荐吗?

3 个答案:

答案 0 :(得分:2)

您的脚本可能已超时。尝试禁用内置时间限制:

set_time_limit(0);

如果您在共享托管服务器上托管您的网站或应用程序,请确保您可以执行此操作。一些网络托管商(包括我的)在使用大量服务器资源执行此类任务时不满意。

答案 1 :(得分:1)

我们使用数百页创建PDF文件(使用fpdf)没有任何问题,所以我猜你的代码是收集/显示导致请求超时的数据。

当您的HTTP请求需要很长时间才能完成(超过10秒)时,您的脚本可能只需花费太多时间即可完成。

我真的认为问题是for循环内发生的问题。尝试使用大约相同数量的页面创建简单虚拟PDF。如果可行,您知道必须在for循环中搜索问题。

答案 2 :(得分:1)

将脚本移至crontab并将已保存的pdf设置为文件。脚本完成后,将其设置为发送电子邮件,告诉您该过程已完成。

粗略的伪代码:

require('lib\fpdf.php');
require ('lib\pdf.php');
include ('lib\bukaDb.php');

$pdf = new PDF('P','pt','A4');
$pdf->SetFont('Arial','',8);
$pdf->AliasNbPages();
$pdf->Open();
$pdf->setY($pdf->tMargin);

for ($i=0; $i<count($var); $i++){   
//Do something , show data
//$pdf->Ln(20);
}

// Finally, produce the PDF!!
$savefile = "/path/to/output/dir/output.pdf";
$pdf->Output($savefile,'I');

mail('admin@example.com', 'PDF Generator', "PDF has been generated at $savefile");

然后,您只需将其保存到服务器上的某个位置并将其路径设置为crontab:

/path/to/php/cli/php /path/to/your/saved/php/pdf_generator.php

请注意,您必须:

  • 确保您的$savefile目录可以通过脚本写入。
  • 使用php cli,而不是通过浏览器访问脚本,因为它也会受到时间限制的影响。