在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
答案 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);
它解决了这个问题。