Mpdf laravel слишком много для создания pdf для 50k записей - PullRequest
0 голосов
/ 04 августа 2020

Я использую Mpdf ссылку для создания html в pdf на одном из моих веб-сайтов, pdf генерируется нормально, но проблема в том, что он занимает слишком много времени только для 50000 строк в таблице, примерно 15 -20 минут.
без CSS это занимает половину времени, но, все еще слишком долго, в pdf нет изображений, только простые тексты в таблице html.
Ниже я делюсь своим кодом, если кто-то предлагает что-то действительно полезное для меня.

Код контроллера

ini_set('max_execution_time', '2000');
ini_set("pcre.backtrack_limit", "100000000");   
ini_set("memory_limit","8000M");
ini_set('allow_url_fopen',1);

$data = array();
$response = array();

$paymentDue = DB::table('payment_due_view')
->select('payment_due_date', 'customer_name', 'invoice_number', 
'business_name','order_total', 'phonenumber', 'email', 'payment_status')
->where('order_total', '>', '0')
->whereNull('deleted_at')
->orderBy('payment_due_date', 'desc');

$paymentDue = $paymentDue->limit('50000');
$paymentDue = $paymentDue->get()->toArray();

$data['todaysPaymentListData'] = $paymentDue;
 
$mpdf = new Mpdf();
$mpdf->useSubstitutions = false;
//$mpdf->simpleTables = false;

$html = \View::make('admin.screen.payment_due_pdf')->with('data', $data)->render();


$chunks = explode("chunk", $html);
foreach($chunks as $key => $val) {
    $mpdf->WriteHTML($val);
}

$pdfFileName = 'payment_due_report'.time().'.pdf';
$pdf_path = public_path() . '/payment-due-pdf/' . $pdfFileName;
$mpdf->Output($pdf_path, 'F');

$baseUrl = url('/');
$downloadUrl = $baseUrl.'/payment-due-pdf/'.$pdfFileName;

Просмотр Код

<table class="row" width="100%" bgcolor="#ffffff" align="center" cellpadding="0" cellspacing="0" border="0" 
style="border-collapse:collapse; text-align:left; border-spacing:0; max-width:100%;margin-top: 10px;">
    <tr>
        <td style="border-collapse:collapse; border-spacing:0;text-align: right;padding-right: 18px;font-size: 12px !important;line-height: 20px;padding-top: 10px;"> Report Date -  {{date('m/d/Y', strtotime($reportedDate))}}</td>
    </tr>      
</table>

<table width="100%">
    <tr>
        <td style='padding:10px 10px 10px 10px; text-align:center'>
        <h3 style="text-align: center; margin-top: 30px;"> Customer Payment Due Report </h3>
        </td>
    </tr>    
</table>

<table cellpadding='1' cellspacing='0' style='border:1px solid #4E4E5B; border-bottom:0;line-height:21px;margin:auto;width:100%; background:#fff; font-size:12px;text-align:center'>
    <tr style='border-bottom: 1px dashed #CECECE;'>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Payment Due Date</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Due Status</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Customer Name</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Invoice Number</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Business Name</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Order Total</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Phone Number</th>
        <th style='border-bottom: 1px solid #4E4E5B; border-right: 1px solid #4E4E5B; border-top:0; border-left:0;background:#306EBA;color:#fff;'>Email</th>          
    </tr>
    @if(isset($data['todaysPaymentListData']) && !empty($data['todaysPaymentListData']))
        @foreach($data['todaysPaymentListData'] as $val)
chunk
            @php $number = 'N/A'@endphp
            @if($val->phonenumber != '')
                @php $number = $val->phonenumber @endphp
            @endif

            @if(strtotime($val->payment_due_date) == strtotime(date('Y-m-d')))
                @php $dueStatus = 'Due Today' @endphp
            @elseif(strtotime($val->payment_due_date) > strtotime(date('Y-m-d')))
                @php $dueStatus = 'Future Due' @endphp
            @else
                @php $dueStatus = 'Past Due' @endphp
            @endif
            
            @php $businessName = 'N/A'@endphp
            @if($val->business_name != '')
                @php $businessName = $val->business_name @endphp
            @endif
            <tr>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ \Helper::getDateTimeByTimezone($val->payment_due_date) }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $dueStatus }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $val->customer_name }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $val->invoice_number }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $businessName }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">${{ $val->order_total }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $val->phonenumber }}</td>
                <td style="font-size:12px; text-align:center; border-right: 1px solid #4E4E5B; border-bottom: 1px solid #4E4E5B; word-wrap: break-word;">{{ $val->email }}</td>
            </tr>
        @endforeach
    @endif
</table>
...