You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:45:15