TCPDF - 仅包含大文件的实时服务器上的内部服务器错误(500)

时间:2017-04-04 14:41:51

标签: php html pdf tcpdf internal-server-error

尝试渲染大文件时遇到TCPDF问题:66页HTML表格,但问题只有在将脚本推送到实时服务器后才会发生。

我的localhost呈现文件完成,虽然速度很慢,但实时服务器最终会返回500内部服务器错误。

据我所知,实际脚本没有任何问题,因为将HTML表的大小减少到500行会在几秒钟内返回PDF。我的localhost需要一分钟才能返回相同的500行,并且需要4分钟才能返回完整的表格,所以我原本认为实时服务器会对它进行简短的处理,但它无法处理它。

同样,PDF的批量内容是由一个脚本生成的,在我的localhost上渲染需要30秒以上,而实时服务器会对其进行简短的处理,并且可以在不到一秒的时间内返回结果因此,实时服务器的性能被证明是优越的(当然,正如您所期望的那样)。

我已经设定,但无济于事:

ini_set("memory_limit", "-1");
ini_set('max_execution_time', 0);
set_time_limit(0);

服务器是共享主机,但我确实对它有很多控制权,如果我不能自己做,主机提供商愿意做出合理的改变。但是,在我要求他们做出任何改变之前,我需要查明原因。

这并不理想,但即使文件需要很长时间才能完成,我很乐意实施解决方案,以便在后台呈现文件,然后在完成后通过下载链接向用户发送电子邮件。但是,由于渲染中止,我甚至无法做到这一点。

非常感谢任何帮助!

编辑:

在注释中提醒之前我忘了提及:错误日志中没有任何内容。如果我从脚本中删除了一些关键的东西,比如DB连接器,那么就会按预期记录,但是没有任何与TCPDF相关的内容被记录。

其他信息:

我最初使用的是Dompdf,但是无法在不失败的情况下渲染超过100行的同一个表。这是本地和实时服务器,这是一个耻辱,因为它很好地处理CSS和HTML,并且需要更少的内容定位解决方案。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的错误,并得出结论,问题是在为表生成HTML并将其转换为PDF格式时形成的瓶颈。

首先,我将代码分成两个“部分”。我通过在外部运行查询并将结果保存到JSON文件来避免在循环内部生成数据行的复杂MySql查询。

然后读取JSON文件我使用multicell()来构建我的行和列

// Set MuliCell Defaults
$height = '5';
$border = '1';// 1/0 or L, T, R, B
$align = 'L';// L, C, R, J
$fill = '0'; //1/0
$Ln = '0';// 0=right, 1 = beginning of next line, 2=below
$floatX = '';
$floatY = '';
$resetH = 'true';


// Header
$pdf->SetFont('helvetica', 'n', 15);
$pdf->MultiCell('85', $height, 'SKU', $border, $align, $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('280', $height, 'Product', $border, $align, $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('68', $height, 'Price', $border, 'R', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('68', $height, 'Pk Size', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('68', $height, 'Min', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('68', $height, 'Ord Lvl', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('68', $height, 'On Hnd', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('70', $height, 'Counted', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
$pdf->MultiCell('32', $height, 'Var', $border, 'C', $fill, $Ln, $floatX, $floatY, true);

// Set DataRows
$pdf->SetXY('13', '50');
$pdf->SetFont('helvetica', '', 10);
$pdf->SetTextColor(0,0,0);
$pdf->setCellPaddings(3, 3, 3, 3);

if (!empty($json))
    {
        $rows = '0'; // Counter for rows of processed data
        foreach($json as $item) //start loop for adding
            {
                $pdf->Ln(18);// Set a new line BEFORE each datarow
                $pdf->SetX('13');                       
                $pdf->MultiCell('85', $height, $item['sku_prd'], $border, $align, $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('280', $height, substr($item['name_prd'],0,60), $border, $align, $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('68', $height, $item['prefix_cur'].$item['sto_price'], $border, 'R', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('68', $height, $item['sto_pack_size'], $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('68', $height, $item['sto_min'], $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('68', $height, $item['sto_reorder_level'], $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('68', $height, $item['sto_qty_on_hand'], $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('70', $height, '', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                $pdf->MultiCell('32', $height, '', $border, 'C', $fill, $Ln, $floatX, $floatY, true);   
                $rows++;// increment with 1 after each datarow

                if ($rows == 27) // Set max number of datarows per page
                    {
                        $pdf->AddPage();
                        $pdf->SetXY('13', '18');

                        // Header
                        $pdf->SetFont('helvetica', 'n', 15);
                        $pdf->MultiCell('85', $height, 'SKU', $border, $align, $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('280', $height, 'Product', $border, $align, $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('68', $height, 'Price', $border, 'R', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('68', $height, 'Pk Size', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('68', $height, 'Min', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('68', $height, 'Ord Lvl', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('68', $height, 'On Hnd', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('70', $height, 'Counted', $border, 'C', $fill, $Ln, $floatX, $floatY, true);
                        $pdf->MultiCell('32', $height, 'Var', $border, 'C', $fill, $Ln, $floatX, $floatY, true);

                        // Reset font and rows to DataRows
                        $pdf->SetFont('helvetica', '', 10);
                        $pdf->SetXY('13', '25');
                        $rows = '0';// reset to "0" ready for the new page
                    }                                   
            }
    }

https://www.xms-systems.co.uk/article-262-tabular-data-with-tcpdf-and-internal-server-500-error.html