使用Laravel导出大量数据的PDF

4
我有下面的代码
$html = '';
foreach ($posts as $post) {
        $html .= '<div class="table-scrollable">
                        <table id="posts" class="table table-bordered table-hover">
                            <thead>
                                <tr>
                                    <th>Id</th>
                                    <th>Name</th>
                                    <th>Title</th>
                                </tr>
                            </thead>
                            <tbody id="body"><tr>
                                <td>'
                . $post->id . ' 
                                </td>
                                <td>' .
                $post->name .
                '</td>
                                <td>'
                . $post->title .
                '</td> 
                    </tr>
                   </tbody>
                </table>
            </div>';
}
return PDF::load($html, 'A4', 'portrait')->download('my_pdf');

当我想下载大量数据时,出现了以下错误:The localhost page isn’t working localhost is currently unable to handle this request. 但是,如果我尝试下载例如20个条目,则可以正常工作。我该怎么办? laravel.log
[2016-11-24 13:15:17] production.ERROR: 错误异常 'ErrorException',错误信息为 'Undefined variable: data_start',位于文件 '/Applications/XAMPP/xamppfiles/htdocs/dicom/app/controllers/IncasariController.php' 的第58行。堆栈跟踪:0 /Applications/XAMPP/xamppfiles/htdocs/dicom/app/controllers/IncasariController.php(58):Illuminate\Exception\Handler->handleError(8, 'Undefined varia...', '/Applications/X...', 58, Array);1 [内部函数]:IncasariController->filtrareChitante();2 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231):call_user_func_array(Array, Array);3 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(93):Illuminate\Routing\Controller->callAction('filtrareChitant...', Array);4 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(62):Illuminate\Routing\ControllerDispatcher->call(Object(IncasariController), Object(Illuminate\Routing\Route), 'filtrareChitant...');5 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/Router.php(962):Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'IncasariControl...', 'filtrareChitant...');6 [内部函数]:Illuminate\Routing\Router->Illuminate\Routing{closure}();7 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/Route.php(109):call_user_func_array(Object(Closure), Array);8 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1028):Illuminate\Routing\Route->run(Object(Illuminate\Http\Request));9 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Routing/Router.php(996):Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request));10 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(775):Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request));11 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(745):Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request));12 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Session/Middleware.php(72):Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true);13 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Cookie/Queue.php(47):Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true);14 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Cookie/Guard.php(51):Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true);15 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23):Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true);16 /Applications/XAMPP/xamppfiles/htdocs/dicom/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(641):Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request));17 /Applications/XAMPP/xamppfiles/htdocs/dicom/public/index.php(49):Illuminate\Foundation\Application->run();18 {main} [] []

并且在网页上是:

The localhost page isn’t working

localhost is currently unable to handle this request.

请告诉我们更多关于您正在使用的软件的信息(xampp?Mac?Linux?),以及您目前用于PDF的软件包。 - Imam Assidiqqi
请发布一些日志条目,例如在laravel.log中或在apache/nginx error.log中。 - sleepless
@ImamAssidiqqi 我正在使用XAMPP。这是我使用的软件包:https://github.com/barryvdh/laravel-dompdf/tree/0.4 - Sulde1985
那个错误提示了其他地方的问题 - 运行 composer install,composer dump-autoload。 - Jonny C
@JonC 运行了...但是什么也没有发生 :( - Sulde1985
显示剩余3条评论
2个回答

1
您的代码假定每个记录都有一个ID、名称和标题。在调用它们之前,我建议检查是否已经设置了这些内容。可以像这样进行检查。
foreach ($posts as $post) {

$id= isset($post->id) ? $post->id : 'ID Not Set';
$name= isset($post->name) ? $post->name : 'Name Not Set';
$title= isset($post->title) ? $post->title : ' Title Not Set';

    $html .= '<div class="table-scrollable">
                    <table id="posts" class="table table-bordered table-hover">
                        <thead>
                            <tr>
                                <th>Id</th>
                                <th>Name</th>
                                <th>Title</th>
                            </tr>
                        </thead>
                        <tbody id="body">
                          <tr>
                            <td>'. $id .'</td>
                            <td>'. $name .'</td>
                            <td>'. $title .'</td> 
                          </tr>
               </tbody>
            </table>
        </div>';
}

如果它们没有被设置,可能会导致您的代码出现“对象未找到”错误。 您可以从storage/logs文件夹检查日志。

1
注意:自PHP 7.0以来,可以添加$id ?? '';。这将检查$id是否设置,如果是,则设置变量。如果变量未设置,则采用给定的变量,在本例中为一个空字符串。 - D. J.

0

嗯,你试图将大型数据集导出为PDF。我的建议:

  1. 尝试制作自定义CSS以减少页面加载(您可以将类复制粘贴到自定义CSS中)
  2. 在XAMPP上更改php.ini的最大执行时间(1分钟、5分钟、10分钟等)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接