2014-04-18 3 views
0

Magento에서이 오류가 발생했습니다. 나는 이것이 메모리 문제라는 것을 알고 있지만, 나는 이것을 유발하는 코드를 알고있다. 어떻게 그런 문제를 해결할 수 있습니까? 동일한 코드가 오랫동안 작동하고 갑자기 문제가 발생합니다.치명적 오류 : 허용 된 메모리 크기가 134217728 bytes exhausted Magento

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 94115841 bytes) in /home/wwwcruk/public_html/cas/app/design/frontend/default/cas/template/brandproduct/brand-listcar.phtml on line 60

내가 htaccess에서 256M을 할당했습니다. 위의 파일에서 코드를 제거하면 작동합니다. 이것은 코드의 일부입니다.

<?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 }?> 

난 아직도 메모리 제한을 증가 후 오류가 발생했습니다 :이 문제를 일으키는 두 줄 ($manufacturer['label'][0] == $char가) 있습니다.

[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

[PHP : 치명적 오류 : 허용 된 메모리 크기 134217728 Bytes Exhausted (CodeIgniter + XML-RPC)] 복제본 (http://stackoverflow.com/questions/561066/php-fatal-error-allowed-memory- size-of-134217728-bytes-exhausted-codeigniter) – Stony

+0

@Stony이 코드를 index.php 파일에 넣었을 때'ini_set ('memory_limit', '-1');''500 Internal Server Error'가 있습니다. – Adda

+0

메모리 할당 오류 (128M)의 일반적인 부족, Magento는 256M 이상이 필요합니다. 최신 버전, 10k 카탈로그, 10k 고객은 512M 이상으로 만듭니다. 외부 PHP 스크립트를 실행하는 경우 명령 줄 PHP 인터프리터의 메모리 제한도 설정해야합니다. –

답변

0

이것은 불규칙하게 보입니다. 하지만 질문에 더 많은 코드를 넣을 수 있습니까? $ char 또는 $ J가 큰 숫자보다 큰 경우 while 루프가 중단되지 않습니다. 우리는 당신의 전체 루프가하려고하는 것을 볼 수 없습니다.

삭제할 코드는 무엇입니까? 이 두 줄만있는 것이 아닙니다.

나는 또한 256M은 엄청난 양의 메모리가 아닐 것이라고 말하고 싶다. 네가 위로 가면 여전히 새로운 한도에 도달 했니?

*** 아래의 주석을 수정하십시오.

모든 코드를 추가해 주셔서 감사합니다. 나는 당신이 당신의 코드를 분석했다고 확신하지만 여기서부터 나의 유일한 코멘트는 while 루프가 어떻게 작동하는지에 관한 것이다. $char은 아마도 0부터 세며 아마도 제조업체 레이블 또는 수준과 일치하는 정수입니다. 좋았어, 그 계획에 아무 잘못이 없어.

그러나 아마 $charforeach 루프의 매우 시작에서 0으로 다시 설정해야합니다

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

$manufacturers에서 $manufacturer의 순서가 $manufacturer['label'][0]을 증가시켜 정렬되지 않은 경우에는 while 루프가 멈추지 않을 것이기 때문에 예를 들어 foreach 루프 $char의 다섯 번째 반복이 8이고 $manufacturer['label'][0]4 일 수 있기 때문입니다.

의미가 있습니까? 나는 당신의 코드를 모르지만, while 루프는 대안적인 출구가 없으며, while 루프에 fail-safe를 추가하는 것이 불가능하다고 생각한다. 신중해야한다. 예를 들면 :

<?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 
?> 

그러나 것은 $ 제조업체의 순서를 확인하고 어떤 점에서 0-$char를 재설정하고이 일을 해결되는지 확인. 메모리를 늘려야하고 시스템이 ini_set()을 사용할 수 없다면 php.ini 파일을 편집하고 거기에 메모리 제한을 설정할 수 있습니다. 그리고 웹 서버를 다시 시작하여 php.ini 변경 사항을 적용하는 것을 잊지 마십시오.

+0

응답 해 주셔서 감사합니다. 문제의 주요 코드를 추가했습니다. 도움이 될지 확인할 수 있습니다. – Adda

+0

나는 당신의 코드를 시도했으나 작동하지 않았다. 나는 '512MB' 메모리를 증가 시켰지만 아직도 erro.You 내 질문에 위를 볼 수 있습니다. – Adda

+0

추가 정보를 제공해 주셔서 감사합니다. 앨런의 대답은 정확합니다. 이제 새로운 메모리 제한을 따르고 있습니다. – Malachy

4

몇 가지 - 먼저 게시 한 코드는 문제가 아닙니다. PHP가 메모리 한계에 부딪혔을 때 실행되는 코드 일뿐입니다.

Magento는 memory_limit을 256MB로 설정해야합니다. 제가 본 대부분의 상점은 512 MB로 실행됩니다.왜냐하면 PHP는 순환 참조가있는 객체의 대규모 콜렉션/어레이를 실행할 때 메모리가 누출 될 수있는 몇 가지 알려진 버그가 있기 때문입니다. 일반적으로 PHP에서 변수를 사용하면 해당 변수가 필요하지 않으면 PHP는 메모리를 회수합니다. 그래서 "누출"이라고 말할 때, PHP가 메모리를 회수하지 않는 상황이 있습니다. PHP가 메모리를 대량으로 사용하여 초당 분할을 수행 할 수 있습니다.

그러나 - 그게 문제가 아닌 것 같습니다. 오류

Fatal error: Allowed memory size of 134217728 bytes exhausted

그건 134,217,728 바이트 또는 128 MB입니다. PHP 버전은 128MB, 이 아님,은 필요하지 않습니다. 256MB. 1 단계는 이것이 왜인지 알아 내야합니다.

많은 웹 호스트는 공유 된 리소스에 대한 모든 고객의 제한된 리소스에 대한 공정한 액세스를 보장하기 위해 허용 된 메모리를 특정 크기로 제한합니다. 동일한 호스트는 .htaccess를 통해 메모리 제한을 설정하는 고객 (즉, 귀하)을 사용 중지합니다. 종종이 값을 php.ini 파일을 통해 설정해야합니다.

또한이 설정의 shorthand notation은 그리 강력하지 않습니다. 예를 들어, 한도를 512M으로 설정하면 문제가 없지만 512MB을 사용하면 PHP는 문자열 512MB을 약간 낮은 숫자로 처리합니다.

희망 하시겠습니까?

+0

귀하의 자세한 답변을 주셔서 감사합니다. 나는이 문제가 서버에있는 동안 내 로컬 시스템에서 발생하지 않는 이유가 궁금했습니다. 이제 '128MB'에 대한 한 가지 힌트가 있습니다. 호스팅 제공 업체와 관련된 문제에 대해 논의하겠습니다. – Adda

0

나는 정말로 나를 혼란스럽게하는이 문제를 가지고 있었다. 그것은 매우 간단한 MySQL의 쿼리에서 중지 :

$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); 

그것은 문제를 해결 :이에 쿼리를 재 작성

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(); 

.

관련 문제