致命错误:Magento允许的内存大小为134217728字节

时间:2014-04-18 17:50:24

标签: php .htaccess magento memory-management

在Magento我收到了这个错误。我知道这是一个内存问题,但我知道我的代码导致了这个问题。我该如何解决这个问题?相同的代码长时间工作,突然间会产生问题。

  

致命错误:/home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml中允许的内存大小为134217728字节(尝试分配94115841字节)第60行

我从htaccess分配了256M。当我从上面的文件中删除代码时,它工作。这是代码的一部分。这些是导致问题的两行($manufacturer['label'][0] == $char):

 <?php $i=0;$j=0;foreach ($manufacturers as $manufacturer): ?>

<?php if($i == 0 && $manufacturer['label'][0] == $char): $j++;?>

    <li><span class="levelchar"><?php echo $char; ?></span></li>

<?php endif; ?>

<?php if($j>=$heightColumn):?>

    </ul>

    <ul class="level-brandul">

<?php $j=0; endif;?>

<?php while( $manufacturer['label'][0] != $char){ $char++;?>

    <?php if( $manufacturer['label'][0] == $char): $j++; ?>

    <li><span class="levelchar"><?php echo $char; ?></span></li>

    <?php if($j>=$heightColumn):?>

    </ul>

    <ul class="level-brandul">

<?php $j=0; endif;?>

<?php endif; ?>

<?php }?>

增加内存限制后仍然出现错误。

[Mon Apr 21 10:52:52 2014] [error] [client 82.94.176.140]  in /home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml on line 47, referer: http://creationsautosport.co.uk/cas/index.php/catalog/product/view/id/58/s/bmw-m-power-silver-number-plate-surrounds/category/4/
[Mon Apr 21 10:49:50 2014] [error] [client 82.94.176.140] Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 504104961 bytes) in /home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml on line 47, referer: http://creationsautosport.co.uk/cas/index.php/catalog/product/view/id/58/s/bmw-m-power-silver-number-plate-surrounds/category/7/
[Mon Apr 21 10:47:08 2014] [error] [client 82.94.176.140] Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 504104961 bytes) in /home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml on line 47, referer: http://creationsautosport.co.uk/cas/index.php/catalog/product/view/id/58/s/bmw-m-power-silver-number-plate-surrounds/category/9/
[Mon Apr 21 10:46:56 2014] [error] [client 39.47.121.31] Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 496762881 bytes) in /home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml on line 47

3 个答案:

答案 0 :(得分:4)

有几件事 - 首先,您发布的代码不是问题。这只是当PHP达到内存限制时恰好执行的代码。

Magento要求memory_limit设置为256 MB。我见过的大多数商店运行512 MB。那是因为PHP有​​一些已知的错误,当通过循环引用运行大型集合/对象数组时,内存可以“泄漏”。通常,当您在PHP中使用变量时,一旦不需要该变量,PHP将回收内存。所以当我说“泄漏”时,我的意思是PHP不会回收内存的情况,这可能导致PHP在一瞬间使用大量内存。

然而, - 这似乎不是你的问题。你的错误

  

致命错误:允许的内存大小为134217728字节耗尽

那是134,217,728字节 - 或128 MB。您的PHP版本设置为使用128MB,所需的256MB。第一步应该弄清楚为什么会这样。

许多Web主机将其允许的内存限制在一定的大小,以确保在共享资源上公平访问所有客户的有限资源。这些相同的主机将禁用通过.htaccess设置内存限制的客户(即您)。您经常需要通过php.ini文件设置此值。

此外,此设置的shorthand notation并不强大。例如,如果您将限制设置为512M,那么您会很好,但使用512MB,PHP会将字符串512MB视为少数。

希望有所帮助!

答案 1 :(得分:0)

这肯定是不规则的。但是你可以在你的问题中加入更多代码吗?如果$ char或$ J大于某个大数字,那么你的while循环没有中断吗?我们无法看到你的整个循环正在尝试做什么。

您要删除的代码是什么?它不仅仅是这两条线吗?

我还会说256M可能不是一个巨大的内存量。如果你了,你还能达到新的限制吗?

***编辑以下评论:

感谢您添加所有代码。我确定你已经分析了你的代码,但我在这里的唯一评论是关于while循环的功能。似乎$char是一个整数,可能是从0开始计算的,并且您将其与制造商标签或级别相匹配。好,这个计划没有错。

但是$char循环的开头可能应该将foreach设置回零:

<?php
    $i=0;
    $j=0;
    foreach ($manufacturers as $manufacturer):
      $char = 0;//or whatever its initial value should be
      //...
?>

因为$manufacturer中的$manufacturers的顺序不是通过增加$manufacturer['label'][0]来排序的,那么while循环将永远不会停止,因为例如foreach循环的第五次迭代$char可能是8$manufacturer['label'][0]可能是4

这有意义吗?我不知道你的代码,但是while循环没有替代退出,我认为即使不可能,在while循环中添加一个故障保护也是谨慎的。如:

<?php

    $bailAt = PHP_INT_MAX - 1;//this is a very large number => wait a long time to bail
    $bailAt = 32000; //if you have over 32000 manufacturers in Magento you probably have other issues too
    while( ($manufacturer['label'][0] != $char) && ($char < $bailAt) ){
      $char++;

      //...
    }//end while
    if ($char==$bailAt){
       //recover gracefully
       echo("<!-- there was an error building the manufacturer levels (reached maximum levels) -->");
       echo("</ul>"); //you might not need that
    }//end if
?>

但请检查$制造商的订购情况,并在某个时候将$char重置为0并查看是否有问题。如果您确实需要增加内存而系统无法使用ini_set(),那么您可以编辑php.ini文件并在那里设置内存限制(不要忘记重新启动Web服务器以应用php.ini更改)。

答案 2 :(得分:0)

我有这个问题让我很困惑。它停在一个非常简单的MySQL查询:

stmt = $link -> prepare("SELECT 'content' FROM `pages` WHERE `ID`=? LIMIT 1")) {
$stmt -> bind_param("s", $pageID);
$stmt -> execute();
$stmt -> bind_result($result);
$stmt -> fetch();
if (!$result) {
   return FALSE;
}
$stmt -> close();

我将查询重写为:

$sql_content = "SELECT `content` FROM `pages` WHERE `ID`=".mysql_real_escape_string($pageID). " LIMIT 1";
$q_content = mysqli_query($link, $sql_content);
$r_content = mysqli_fetch_assoc($q_content);

它解决了这个问题。