Laravel 9手动分页生成大量数据时内存耗尽问题求助
解决Laravel 9手动分页超大数字范围的内存耗尽问题
你的代码核心问题是提前生成了全部16777216条数据并存储在数组$range中,这么大规模的数据直接占满内存,必然触发Allowed memory size exhausted错误。要解决这个问题,根本思路是不需要预存所有数据,只按需生成当前分页需要的条目——因为你的数据是有规律的(固定格式字符串+连续数字),完全可以计算出当前页要展示的数字范围,只生成这部分数据。
修改后的代码
$start = (int)"0"; $end = (int)"16777216"; // 直接计算总条目数,无需生成数组再统计 $total = $end - $start + 1; $perPage = 25; $currentPage = request()->input("page") ?? 1; // 计算当前页的起始数字(与起始值$start联动) $pageStart = $start + ($currentPage - 1) * $perPage; // 计算当前页的结束数字,确保不超过$end边界 $pageEnd = min($pageStart + $perPage - 1, $end); // 只生成当前页需要的25条数据 $paginatedItems = []; for ($i = $pageStart; $i <= $pageEnd; $i++) { $paginatedItems[] = "Number $i"; } $paginated = new Paginator( $paginatedItems, $total, $perPage, $currentPage, ['path' => request()->url(), 'query' => request()->query()] ); return $paginated;
关键优化点
- 彻底避免大数组占用内存:不再生成包含1600多万条数据的数组,只生成当前页的25条数据,内存占用可忽略。
- 直接计算总条目数:用
$end - $start + 1得到总条数,无需依赖数组count()方法。 - 边界安全处理:用
min()确保最后一页的结束数字不超出$end范围,避免无效数据生成。
修改后分页逻辑和原代码完全一致,前端分页导航、页码跳转等功能不受影响,同时彻底解决内存耗尽问题。
内容的提问来源于stack exchange,提问作者Rizwan Ranjha
相关产品推荐
相关产品推荐

