致命错误:内存分配超出了允许的大小134217728字节(尝试分配87字节)

9

当我登录到我的Web应用程序时,它显示以下错误:

致命错误:在 /gt/2.ps.fo/home/hft/domains/console.fo.spalgo.com/public_html/cake/libs/model/datasources/dbo/dbo_mysql.php 的第 775 行尝试分配 87 字节时,内存大小已耗尽(尝试分配 134217728 字节)

有解决此问题的方法吗?为什么会出现这个错误?


这意味着你的代码正在执行某些操作,消耗了所有可用的内存。修复它,使其使用更少的内存和/或执行更少的操作。 - deceze
5个回答

10
这似乎意味着你已经分配了超出PHP允许的内存量的内存。按照链接页面上所述的方式编辑站点php.ini配置中的memory_limit设置。

另一个可能性(较小)是你已经达到了你的用户或组的setrlimit(2)资源限制。检查/etc/security/limits.conf,以查看为您的Web服务器设置的限制,以及启动服务器环境和PHP解释器环境的任何初始化脚本。


虽然这两种说法都有可能,但更有可能与内存限制有关。然而,仅仅增加内存限制并不能解决问题,因为你必须检查为什么一个脚本会分配那么多内存。为了补充你的答案,我添加了另一个。 - AlphaZygma

3
我找到的第一个与“PHP内存不足”有关的SO搜索示例是这个

1
尝试使用 echo 而不是先将要打印的内容存储到变量中。

1
看到抛出致命异常的文件(dbo_mysql.php),我推测您的调用正在从数据库检索数据。
另外,查看内存限制,显示为134217728字节,即128MB,因此我认为无论您的API调用正在做什么,都在尝试获取大量数据,其总量超过每个脚本分配的限制。
例如,如果API调用堆栈中的最后一个脚本使用了20MB来满足其需求,然后试图从数据库中获取价值115MB的数据,则您的脚本将尝试分配135MB,这已经比限制多7MB,从而导致致命异常。
因此,我看到需要检查/执行以下几件事情:
  1. 确保你不会检索到不必要的数据,或者说,只检索你需要的数据。
  2. 如果你确实需要所有这些数据,则:
    • 要么增加php.ini文件下的memory_limit
      缺点: 如果你的数据不断增长,你可能需要不断更新这个值,仅为一个脚本暴露自己的内存泄漏或内存耗尽风险。
    • 要么我建议你实现一些分页方式(这将使你能够控制内存限制),并使你的应用程序更具可扩展性。

0
ini_set('memory_limit', '-1');

1
通过使用-1,它将不限制内存并可能会泄漏。您应该避免使用此配置,只有在没有选择时才使用它。 - Mike Nguyen

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