【问题标题】:Cakephp memory limit error after migration, troubleshooting Controller迁移后Cakephp内存限制错误,Controller排查
【发布时间】:2020-10-29 09:19:26
【问题描述】:

我正在将生产服务器 Cakephp 2.3.8 项目复制/迁移到开发项目中,但出现了著名的错误:

块引用 致命错误 错误:1073741824 字节的允许内存大小已用尽(尝试分配 200648563 字节) 文件:/var/www/html/lib/Cake/Utility/String.php 线路:243

注意:如果要自定义此错误信息,请创建 app/View/Errors/fatal_error.ctp

我已经镜像了与生产服务器相同的规格:

  • 试图将 apache > php.ini 文件的默认内存限制从 128M 增加到 1024
  • 也是 1024 到 2048,但没有运气
  • 重新启动服务器和 apache 服务
  • 限制我的数据库上的数据集(目前有 6 个,但生产服务器在我正在查询的表上有大约 40K 行)
  • 测试了控制器内部的一个函数,只显示一行文本(成功显示它,但致命错误消息不断出现)。

这主要发生在我访问某些控制器时,因为我能够正确加载某些页面(显然)。

我目前正在日志文件中调试应用程序的行为:

  • /ppp/tmp/logs/error.log
  • Xdebug

但是它们都没有显示致命错误限制的更多详细信息,我被告知这可能是内存泄漏,如果两台服务器都以相同的方式受到限制怎么办? (以下服务器的 ulimit)。


我想知道问题是什么,我错过了一个设置?我怎样才能调整控制器以使其正常运行?

开发服务器规格

  • Centos 7
  • PHP 5.4.16 (cli)(构建时间:2020 年 4 月 1 日 04:07:17)
    版权所有 (c) 1997-2013 PHP Group
    Zend Engine v2.4.0,版权所有 (c) 1998-2013 Zend Technologies
    使用 Xdebug v2.2.7,版权所有 (c) 2002-2015,作者 Derick Rethans
  • Linode 上的 VPS:2 核 4 GB RAM
  • 上限:
    核心文件大小(块,-c)0
    数据段大小 (kbytes, -d) 无限制
    调度优先级 (-e) 0
    文件大小(块,-f)无限制
    未决信号 (-i) 15076
    最大锁定内存 (kbytes, -l) 64
    最大内存大小 (kbytes, -m) 无限制
    打开文件 (-n) 1024
    管道大小(512 字节,-p)8
    POSIX 消息队列(字节,-q)819200
    实时优先级 (-r) 0
    堆栈大小(千字节,-s)8192
    cpu时间(秒,-t)无限
    最大用户进程 (-u) 15076
    虚拟内存 (kbytes, -v) 无限制
    文件锁 (-x) 无限制

生产服务器

  • Centos 7
  • PHP 5.4.16 (cli)(构建时间:2020 年 4 月 1 日 04:07:17)
    版权所有 (c) 1997-2013 PHP Group
    Zend Engine v2.4.0,版权所有 (c) 1998-2013 Zend Technologies
  • 专用服务器:16 核(32 线程),128Gb RAM
  • 上限:
    核心文件大小(块,-c)0
    数据段大小 (kbytes, -d) 无限制
    调度优先级 (-e) 0
    文件大小(块,-f)无限制
    待处理信号 (-i) 514324
    最大锁定内存 (kbytes, -l) 64
    最大内存大小 (kbytes, -m) 无限制
    打开文件 (-n) 8192
    管道大小(512 字节,-p)8
    POSIX 消息队列(字节,-q)819200
    实时优先级 (-r) 0
    堆栈大小(千字节,-s)8192
    cpu时间(秒,-t)无限制
    最大用户进程 (-u) 8192
    虚拟内存 (kbytes, -v) 无限制
    文件锁 (-x) 无限制


提前致谢

更新 1
这是将 lib/Cake/View/Errors/fatal_error.ctp 复制到 app/View/Errors/fatal_error.ctp 并添加后显示的内容
<pre><?php echo h($error->getTraceAsString()); ?></pre>

致命错误 错误:允许的内存大小 1073741824 字节已用尽(尝试分配 126212148 字节) 文件:/var/www/html/lib/Cake/Utility/String.php 线路:243

注意:如果要自定义此错误信息,请创建 app/View/Errors/fatal_error.ctp

20 年 7 月 9 日更新

#0 /var/www/html/lib/Cake/Error/ErrorHandler.php(184): ErrorHandler::handleFatalError(1, '允许的内存...', '/var/www/html/l. ..', 243)

#1 [内部函数]: ErrorHandler::handleError(1, 'Allowed memory ...', '/var/www/html/l...', 243, Array)

#2 /var/www/html/lib/Cake/Core/App.php(931): call_user_func('ErrorHandler::h...', 1, '允许的内存...', '/var /www/html/l...', 243, 数组)

#3 /var/www/html/lib/Cake/Core/App.php(904): App::_checkFatalError()

#4【内部函数】:App::shutdown()

#5 {主}

在此之前,我正在取出一些组件和助手:

var $helpers=array("Js","Html","Form","Paginator","Fck","Cache","Pagination");
var $components=array("Customcomponent","Paginator","RequestHandler","Cookie","Pagination","Email");

但没有运气(得到相同的错误消息),我的其他控制器不使用助手,只有以下组件:
var $components=array("Customcomponent","RequestHandler","Cookie","Email","Pagination","Paginator");

【问题讨论】:

    标签: php memory cakephp centos7


    【解决方案1】:

    不清楚什么叫String.php Line: 243,完整的调用堆栈可能会有所帮助

    lib/Cake/View/Errors/fatal_error.ctp复制到app/View/Errors/fatal_error.ctp并添加

    <pre><?php echo h($error->getTraceAsString()); ?></pre>
    

    【讨论】:

    • 帖子更新了,留言有用吗?听起来和 Cakephp 库有关吗?
    • 不幸的是,错误发生在关机期间,没有提供更多有用的信息。我怀疑它在渲染原始错误期间发生,但错误输出太大。尝试使用相同的生产设置(调试关闭,错误登录),也许它会工作。
    • 哇,它成功了!有什么东西出现了,为什么会这样?我在 Configure::write('debug',0); 上更改了值 2 --> 0;
    • 我怀疑 CakePHP 试图渲染另一个错误,但它包含带有大树的变量,可能是递归变量。检查错误日志,它可能包含内存限制错误之前的原始错误。
    • 不,error/debug.log 上的消息,我想我必须继续测试它。
    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多