2013-03-31 5 views
0

나는 그것이 옳다는 것을 모른다. ~ 25000 개 루프 후foreach 수는 PHP에서 제한됩니까?

$x = explode("\n", $y); // Making $x has length 65000 
foreach ($x as $k) { 
    //Some code here 
} 

그리고 종종 내 스크립트 자동 정지 : 나는이 같은 내용으로 PHP 파일이 있습니다. 왜? PHP 기본 구성입니까?

+2

PHP는 메모리 제한에 도달했거나 시간 만료 된 경우에만 중단됩니다. 스크립트의 소요 시간과 메모리 사용량은 얼마나됩니까? (http://www.php.net/function.memory-get-usage.php) –

+0

음, 내 루프의 사용하지 않는 변수를 해제하려고 시도 할 것입니다. – user2228956

답변

3

이 문제가 있기 때문에 2 가지 이유

  1. 스크립트 실행 시간이 할당보다 더 할 수 있습니다 ... php.ini 파일에 max_execution_time을 늘려보십시오. 이것은 상기 foreach 루프에서의 php.ini

+0

내 의견의 멋진 사본;). +1 tho : P –

+0

@Allendar lolz ..하지만 사실 이것은 문제의 해결책입니다 ... 그래서 나는 다른 대답이 없습니다 ... 저를 새로운 PHP 함수 memory_get_usage()에 소개해 주셔서 고맙습니다 ... 그것을 들었지만 결코 사용하지 않았다. – alwaysLearn

+0

Truetrue : D. 다행히 우리는 모두 질문 및 'StackOverflow에 대한 답변'에서 배울 수 있습니다. :) –

1

PHP의 기본 메모리 제한은 8MB입니다. 이는 무제한이기 때문에 기본 PHP 컴파일러가 아닌 표준 배포판을 의미합니다.

$x = array(); 

for ($i = 0; $i < 65000; $i++) { 
    $x[$i] = $i; 
} 


echo (memory_get_peak_usage()/1024).'<br />'; 
echo (memory_get_usage()/1024).'<br />'; 
echo count($x); 

그것은 출력 : :이 코드를 수행 할 때

9421.9375 
9415.875 
65000 

이 테스트하기를, 나는 내 기억 제한 상점 증가했습니다. 그러나 더 많은 메모리를 할당 할 수 없으면 오류로 중단됩니다.

for ($i = 0; $i < 1e6; $i++) { // 1 Million 
    $x[$i] = $i; 
} 

보고서가 다시 표시됩니다.

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 32 bytes) in /Applications/MAMP/htdocs/run_app.php on line 5 

은 개인적인 용도 (I 16 기가 바이트 RAM을 가지고, 그래서 아무 문제가 없다) 나는이 시작 코드 사용 : 당신이 당신의 한계 당신이 그것을 원하는 방식을 증가시킬 수

// Settings 
ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging 
ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite 
ini_set('memory_limit', '2048M'); // Sets the memory that may be used to 512MegaBytes 

이 방법을. 전용 서버가 없다면 온라인 호스트에서 작동하지 않습니다. 당신이하는 일을 모르는 경우 이것은 매우 위험합니다. RAM/리소스가 부족한 경우 무한 루프가 브라우저 또는 OS에 충돌을 일으 킵니다.

0

memory_limit의 값을 변경하려고 참조로 배열을 전달 .FOR 스크립트

  • 메모리 제한 할당보다 더있다. PHP에서는 foreach가 루프를 시작하기 전에 배열 복사본을 만듭니다. 따라서 배열이 100K이면 foreach는 처리를 위해 적어도 100K를 할당합니다. 참조로 전달하면 주소의 크기에만 관심을 가질 수 있습니다.

  • 관련 문제