PhpMyAdmin | 致命错误:已耗尽 134217728 字节的允许内存大小(尝试在未知的第 0 行分配 xxxxxx 字节)

7
我想找出这个错误的原因,但是我失败了。我在服务器上安装了PhpMyAdmin,现在在每个页面的页脚上都会出现以下错误:

致命错误:已用尽 134217728 字节的内存(尝试分配 10934248 字节),位置未知,位于第 0 行

如您所见,我尝试升级 memory_limit(从2MB到128MB),但仍然遇到此错误。现在无论何时我登录 PhpMyAdmin 控制台,都会出现此错误,即使我没有进行任何操作。您有什么建议吗?
我尝试跟随网络上的一些答案,但似乎没有一个能解决这个问题。而且,由于文件是“未知”的,我找不到引发错误的文件,并且我无法理解谁需要这么多内存。

你的新内存限制真的有效吗?你是如何升级内存限制的?更改后是否检查了phpinfo()? - Marcel
是的,我已经重新启动了Apache服务器,PHP也看到了我的新限制(已用尽134217728字节)。 - lollo64
1
哪个phpMyAdmin版本? - Marc Delisle
@MarcDelisle 5.5.33-cll-lve - lollo64
1
可能是 [Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted (CodeIgniter + XML-RPC)] 的重复问题。 (https://dev59.com/rHRB5IYBdhLWcg3wpopm) - miken32
5个回答

2
我知道这是一个老问题,但今天我在运行于Linode虚拟服务器上的Apache上也遇到了同样的问题。在我的情况下,解决方案很简单,只需要启用Zend Opcache即可。由于'/etc/php5/apache2/conf.d/'目录中一个ini文件中的错误,它被禁用了。
我经常出现间歇性的错误,大多数情况下页面和图片都能正常加载,但偶尔会失败。图片会损坏,而且我会看到“连接错误”而不是页面。
以下是我在Apache的error.log文件中看到的一些额外的错误:
[core:notice] [pid 8186] AH00052: child pid 9008 exit signal Segmentation fault (11)
[core:notice] [pid 8186] AH00052: child pid 9007 exit signal Aborted (6)
*** Error in `/usr/sbin/apache2': free(): invalid pointer: 0x00007f56840b63c0 ***

当然还有臭名昭著的:

[:error] [pid 8829] [client nnn.nnn.nnn.n:24471] PHP Fatal error:
  Allowed memory size of 134217728 bytes exhausted (tried to 
  allocate 94008222532912 bytes) in Unknown on line 0, referer:
  https://www.mysiteurlhere.com/node/page

启用Zend Opcache之后,error.log中不再出现错误,并且一切都按照预期工作。


2

不要使用128MB,改用128M,认真尝试一下。


嘿,这真是太棒了。我之前使用的是512MB,但现在改成了512。它可以正常工作。即使我之前尝试将memory_limit设置为-1和0,但都没有帮助。你能告诉我为什么这样做解决了问题吗?@corzoit - Manikandan Arunachalam
是的,这个方法可行,我很想知道为什么它能解决问题。 - Darrell Duane

1
在你的 PHP 脚本中执行此操作:
ini_set('memory_limit', '-1');  // -1 here implies no limit, you can even set it to a bigger number like '192M' for 192Mb space.

这将覆盖默认的内存限制。
这个问题已经被回答过很多次了。

是的,但我想知道这个问题的原因。事实上,我还没有开始任何命令。 - lollo64
那么在运行任何大型脚本之前,您就遇到了这个致命错误? - Nagendra Rao
没错,我在PhpMyAdmin登录后得到了这个脚本。但是尽管出现了错误,我仍然可以正常操作 - 更确切地说,我曾经试图导入一个非常大的sql文件,但是如预期的那样失败了。 - lollo64
在您尝试导入一个大的SQL文件后,出现了这个错误,是吗?您是通过phpmyadmin导入还是编写了一个PHP脚本进行导入?如果是通过PHP,请向我们展示您的代码。 - Nagendra Rao
你尝试导入一个大的 SQL 文件后,出现了这个错误?老实说,我不知道,因为错误总是显示在页面底部。无论如何,我已经尝试直接从 PhpMyAdmin 的“导入”页面导入 SQL 文件。 - lollo64

1
如果您对php.ini的更改没有生效,请尝试更改phpmyadmin的config.inc.php。在大多数情况下,它位于/etc/phpmyadmin。在?>标记之前插入以下行:
$cfg['ExecTimeLimit'] = 300000;
$cfg['MemoryLimit'] = -1;

你可以将$cfg ['MemoryLimit']设置为0。在这种情况下,该值将从php.ini中获取。

0
当数据库中的表数量超过9400时,我遇到了同样的问题。
只有当我使用phpmyadmin向数据库输入查询时,才会出现这个问题。稍后,在开始输入查询后,屏幕上会出现500错误并记录错误日志:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 10934248 bytes) in Unknown on line 0

解决方案是在位于phpmyadmin文件夹中的db_sql_autocomplete.php中注释掉部分代码。
db_sql_autocomplete.php代码:

<?php
 
use PhpMyAdmin\Response;
require_once 'libraries/common.inc.php';

/*
if ($GLOBALS['cfg']['EnableAutocompleteForTablesAndColumns']) {
    $db = isset($_POST['db']) ? $_POST['db'] : $GLOBALS['db'];
    $sql_autocomplete = array();
    if ($db) {
        $tableNames = $GLOBALS['dbi']->getTables($db);
        foreach ($tableNames as $tableName) {
            $sql_autocomplete[$tableName] = $GLOBALS['dbi']->getColumns(
                $db, $tableName
            );
        }
    }
} else {*/
    $sql_autocomplete = true;
//}
$response = Response::getInstance();
$response->addJSON("tables", json_encode($sql_autocomplete));


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