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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:22:41