2013-04-02 7 views
4

XML 데이터를 분석하고 동일한 배열을 정보로 채우는 스크립트가 있습니다.정의되지 않은 배열에 액세스하여 메모리 누수가 발생했습니다.

일부 (거대한) 입력의 경우 스크립트가 충돌했습니다.

문제없이 180 시간 주위 실행되는 foreach 루프가

는 그 다음 그 각각의 새로운 루프, 메모리됩니까 (20 MB 반복 180 memory_get_usage()은 각각의 루프는 약 0.1 MB 추가합니다) 인 사용량이 두 배로 증가했습니다.

많은 로깅을 사용하여 문제를 foreach의 다음 줄로 추적 할 수있었습니다.

$의 푸 = $ F의 [ '부']

$f하기 구조 가지고

array (
    'name' => 'Test', 
    'value' => '4', 
    'unit' => 'min-1', 
) 

그러나 일부 (많은) 경우

(뿐만 아니라 180 반복 전에), 키 unit을 배열에 존재하지 않습니다.

나는 함께 라인을 교체하여 문제를 제거 할 수 있었다 :
$fu = (isset($f['unit']) ? $f['unit'] : ''); 

는 그런 반복이 완료 (완전히 370 반복)까지 실행됩니다.

현상에 대한 설명이 있습니까?

PHP 버전 : PHP 5.3.3-1ubuntu9.10 수호신 - 패치 (구 ...)와 함께

+0

사용중인 PHP 버전은 무엇입니까? – Spudley

+1

지원되는 PHP 버전에서 메모리 누수가 발견되면 PHP 버그 추적기에보고해야합니다. 그러나,'isset()'을 사용하는 해결책이 올바른 것입니다 - 어떤 경우에도 존재하지 않을 수도있는 배열 요소에 접근 할 때 이것은 최상의 방법으로 간주됩니다. – Spudley

+0

@ Spudley : edited -이 것이 알려진 것인지 아닌지 확인하고 싶었습니다. – Alex

답변

3

귀하의 문제는 실제 루프에서 PHP 오류 처리기에서 온하지 않을 수 있습니다.

당신이 말했듯이 모든 "유닛"키가 존재하지 않으므로 오류 (또는 오류 처리기에 따라 예외)가 발생합니다. 여기에는 설치 한 확장 (xdebug?)에 따라 스택 추적 및 추가 디버깅 정보가 포함될 수도 있습니다.

둘 다 메모리를 소비합니다.

변수를 사용하기 전에 존재 여부를 확인하는 것이 좋습니다. 항상 개발 시스템에서 E_NOTICE 오류를 통해 이러한 문제를 볼 수 있습니다.

관련 문제