Laravel Yajra Datatable加载海量数据时崩溃求助
解决Laravel Yajra Datatable加载大量数据时的内存耗尽问题
核心问题分析
你遇到的内存耗尽错误,根本原因不是PHP内存限制不够,而是控制器中一次性把172425条数据全部加载到内存(使用get()方法),即便开启了DataTables的serverSide: true,后端也没有做分页处理,导致内存被占满。
解决步骤
1. 修复控制器代码(关键)
把DB::table()->get()改成直接传递查询构造器,Yajra DataTables会自动处理服务器端的分页、排序、搜索,只会加载当前页需要的数据:
function getdata(){ // 直接传递查询构造器,不要用get()获取全部数据 $query = DB::table('royalti.testapi'); return DataTables::of($query) ->addIndexColumn() ->addColumn('action', function($row){ $btn = '<a href="javascript:void(0)" class="btn btn-info text-white btn-sm">' . $row->Cors . '</a>'; return $btn; }) ->rawColumns(['action']) ->make(true); }
2. 确认PHP内存限制生效
如果修改php.ini后问题仍存在,需确认:
- 修改的是Web服务器使用的php.ini文件(比如Apache/Nginx对应的版本,不是CLI版)
- 修改后重启了Web服务器和PHP-FPM(若使用)
- 可在控制器中添加
dd(ini_get('memory_limit'));,检查当前生效的内存限制是否为512M
3. 优化前端搜索绑定(可选)
你的表格包含两个<thead>,当前搜索框绑定逻辑存在选择器混淆,建议调整为:
$(document).ready(function () { var table = $('#table_employee').DataTable({ processing : true, serverSide : true, responsive : true, dom : 'Bfrtip', ajax: "/api/getdata", columns: [ {data : 'DT_RowIndex', name : 'DT_RowIndex'}, {data : 'action', name : 'action', orderable: false, searchable: false}, {data : 'API', name : 'API' }, {data : 'Description', name : 'Description'}, {data : 'Cors', name : 'Cors' }, {data : 'Link', name : 'Link' }, ], initComplete: function() { // 绑定第二个thead中的搜索框 this.api().columns([2,3,4,5]).every(function() { var column = this; var input = $(column.header()).find('input'); input.on('keyup change clear', function() { if (column.search() !== this.value) { column.search(this.value).draw(); } }); }); } }); // 给第二个thead的列添加搜索框 $('#table_employee thead:eq(1) .th').each(function() { $(this).html('<input type="text" class="form-control rounded shadow" placeholder="search" />'); }); });
原理说明
开启serverSide: true时,DataTables会向服务器发送分页、排序、搜索参数,Yajra DataTables需要接收查询构造器而非已获取的数据集,这样它才能根据前端参数生成对应的LIMIT、ORDER BY、WHERE语句,只查询当前页需要的几十条数据,从根源上解决内存耗尽问题。
内容的提问来源于stack exchange,提问作者Yusuf Giovanno
相关产品推荐
相关产品推荐

