2012-01-31 2 views
5

특정 PHP 스크립트에 허용 된 메모리를 늘리려고합니다. 아무리 내가 뭘, 예를이를 위해 :PHP는 300MB의 RAM을 사용할 수 없습니다.

ini_set('memory_limit', '512M'); 

... 스크립트는 항상 300메가바이트 주위에 메모리가 부족하지 :

내가 여러 검증 한
Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

memory_limit가 실제로 변경되는 것을 의미 . 이 문제는 PHP가 물리적으로MB의 메모리를 할당 할 수 없다는 것을 나타냅니다 (25165824   바이트 + 343810589   바이트 = 352  MB).

나는 해봤 모두 다음과 같은 사양과 PHP/5.3.0 및 두 개의 서로 다른 Windows 기반 컴퓨터에서 PHP/5.3.9 :

윈도우 XP/Windows Server 2003의
  • (두 컴퓨터가 32 비트입니다 1GB 이상 RAM)와 비트 박스는
  • 공식 PHP 32 비트 VC9 바이너리
  • 내가 이해 아파치 2.2 모듈 (타사 32 비트 VC9 바이너리)

로 실행하는 물리적 RAM의 사용 반 스와를 강요 할 것이다. pping 및 느린 것들을 지옥으로 느리게하지만 난 단지 스크립트가 실제로 작동하는지 확인해야하므로 라이브 서버에 배포 할 수 있습니다. 나는 또한 더 큰 값 (동일한 오류를 procuded)과 더 작은 값 (나의 스크립트가 한계에 부딪치게 만들거나 Apache 충돌을 만들었다)을 시도했다.

이 하드 코드 된 메모리 제한의 출처는 무엇입니까?

업데이트 # 1 : Windows Server 2003 상자 (실제로는 VMWare 가상 컴퓨터)를 사용하여 테스트를 추가했습니다. "실제"RAM을 2   GB로 늘렸고 페이징 파일이 1152   MB까지 자랄 수 있음을 확인했습니다. 작업 관리자는 현재 트랜잭션로드가 886   MB이고 사용 가능한 실제 메모리가 1,5   GB임을 보여줍니다. 그러나 정확히 같은 숫자 과 동일한 오류가 발생합니다.

업데이트 # 2 : 앞서 말했듯이 memory_limit 지시문은 적합합니다. ini_get()phpinfo() 모두에 표시됩니다. 얻을 수있는 오류 메시지는 내 것과 약간 다릅니다. 광산은 PHP 의 충돌을 나타냅니다. 다음을 비교하십시오 :

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

나는이 문제를 재현하고보고하기 위해 스크립트를 작성하려고합니다.

+0

PHP가 한 번에 많은 메모리를 차지하려고하는 경우 파일을로드하려고한다고 가정합니다. 한 파일이 아닌 여러 파일로로드하려고 시도하십시오. –

+0

«최적화 할 수없는 경우 , 더 많은 RAM을 구입 ...»글쎄, 언젠가 틀렸어 ...;) 그 모든 기억이 필요하신가요? 300MB는 이미 엄청난 양입니다. 어쩌면 당신은 당신의 스크립트를 조금 최적화 할 수 있습니다 ... – Macmade

+2

OS에 할당 할 300MB 이상의 여유 메모리가 100 % 확실합니까? – DaveRandom

답변

4

OOM 예외는 메모리 제한 warninigs와 다릅니다.

이것은 운영 체제에서 사용할 수있는 리소스가 부족하기 때문에 PHP가 실제로 메모리를 할당 할 수 없음을 의미합니다.

시스템이이를 지원할 수있는 충분한 메모리/페이징을 가지고 있는지 확인해야합니다.

+0

질문을 업데이트했습니다. 분명히 서버에는 충분한 메모리가 있습니다. –

0

PHP는 실제로 max_input_time을 의미의 memory_limit에게 말한다 때때로 때, max_input_time와 시도 (-1 이것에 대한 무한하다).

+0

좋은 지적. 그러나이 값은 이미 20 분으로 설정되어 있으며 충돌이 일찍 발생합니다. 나는 질문을 한 이후로 이것에 대해 연구하지는 않았지만 조만간 코드를 고쳐서 처음부터 그렇게 많은 메모리가 필요하지 않도록해야한다는 것을 알고 있습니다. –

+0

음, 이제는 더 이상 미안할 수 없습니다! – R01010010