현재 위치: > 최신 기사 목록> Array_Walk_Recursive에서 메모리 누출 문제를 피하는 방법? 모범 사례 공유

Array_Walk_Recursive에서 메모리 누출 문제를 피하는 방법? 모범 사례 공유

gitbox 2025-06-25

PHP에서 Array_Walk_Recursive 는 다차원 배열의 모든 요소에서 작동 할 수있는 매우 유용한 기능입니다. 그러나이 기능은 특히 많은 양의 데이터를 처리 할 때 메모리 누출을 유발할 수 있습니다. 메모리 누출로 인해 응용 프로그램의 메모리 사용이 증가하고 결국 시스템이 충돌 할 수 있습니다. 따라서 Array_Walk_Recursive를 사용할 때 메모리 누출을 피하는 방법을 아는 것이 매우 중요합니다.

메모리 누출이란 무엇입니까?

메모리 누출은 메모리를 적용하는 프로그램을 말하지만 더 이상 사용되지 않을 때 해제되지 않으므로 메모리 사용량이 지속적으로 증가하여 궁극적으로 프로그램의 성능과 안정성에 영향을 미칩니다. PHP에서, 메모리 누출은 일반적으로 원형 참조, 무제한 자원 할당 또는 부정 된 변수가 메모리를 차지할 때 발생합니다.

Array_Walk_Recursive 의 기본 사용

Array_Walk_Recursive 함수는 배열을 재귀 적으로 통과하고 각 요소에 콜백 함수를 적용하는 데 사용됩니다. 기본 구문은 다음과 같습니다.

 <span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$callback</span></span><span>);
</span></span>
  • $ 배열은 처리 할 배열입니다.

  • $ 콜백은 배열의 각 요소에 적용되는 콜백 함수입니다.

예를 들어:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(&amp;</span><span><span class="hljs-variable">$item</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
    </span><span><span class="hljs-variable">$item</span></span><span> = </span><span><span class="hljs-variable">$item</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>;
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

실행 결과 :

 <span><span>Array
(
    [</span><span><span class="hljs-meta">0</span></span><span>] =&gt; </span><span><span class="hljs-number">2</span></span><span>
    [</span><span><span class="hljs-meta">1</span></span><span>] =&gt; Array
        (
            [</span><span><span class="hljs-meta">0</span></span><span>] =&gt; </span><span><span class="hljs-number">4</span></span><span>
            [</span><span><span class="hljs-meta">1</span></span><span>] =&gt; </span><span><span class="hljs-number">6</span></span><span>
        )
    [</span><span><span class="hljs-meta">2</span></span><span>] =&gt; </span><span><span class="hljs-number">8</span></span><span>
)
</span></span>

이 기능은 매우 강력하지만 더 큰 데이터 세트를 처리 할 때, 특히 배열에 많은 중첩 배열이나 객체가 포함되어있을 때 메모리 누출 문제가 발생할 수 있습니다.

Array_Walk_Recursive가 메모리 누출을 일으키는 이유는 무엇입니까?

Array_Walk_Recursive는 각 요소를 참조별로 작동합니다. 배열을 재귀 적으로 반복 할 때, 특히 매우 복잡한 구조를 만날 때 적절한 메모리 관리없이 요소를 반복적으로 읽고 수정합니다. 특히 콜백 함수 내에서 새로운 참조 또는 객체가 생성되는 경우 이러한 객체는 제 시간에 파괴되지 않아 메모리 사용이 증가 할 수 있습니다.

일반적인 메모리 누출 예

콜백 함수에서 새 객체를 생성하고 이러한 객체를 명시 적으로 파괴하지 않고 저장한다고 가정 해 봅시다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(&amp;</span><span><span class="hljs-variable">$item</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
    </span><span><span class="hljs-variable">$item</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">StdClass</span></span><span>();  </span><span><span class="hljs-comment">// 새 개체를 만듭니다</span></span><span>
});
</span></span>

이 예에서는 새 객체가 되풀이 될 때마다 생성되며 이러한 객체는 파괴되지 않습니다. 배열이 매우 크거나 재귀 깊이가 깊다면 메모리 누출이 매우 심각해집니다.

메모리 누출을 피하는 방법?

다음은 Array_Walk_Recursive 의 메모리 누출을 피하기위한 모범 사례입니다.

1. unset ()을 사용하여 원치 않는 변수를 삭제하십시오

콜백 함수에서 임시 변수 또는 객체를 생성하면 unset ()을 사용하여 명시 적으로 파괴하십시오. 이것은 시간에 메모리를 자유롭게하는 데 도움이됩니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(&amp;</span><span><span class="hljs-variable">$item</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
    </span><span><span class="hljs-variable">$item</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">StdClass</span></span><span>();
    </span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>);  </span><span><span class="hljs-comment">// 적시에 물체를 파괴하십시오</span></span><span>
});
</span></span>

2. 재귀 작업 대신 발전기를 사용하십시오

발전기는 전체 배열을 한 번에 메모리에로드하는 대신 게으른 방식으로 배열을 통과 할 수있는 효율적인 대안입니다. 생성기를 사용하면 메모리 누출을 효과적으로 피할 수 있습니다.

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">recursive_walk</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$array</span></span></span><span>) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> =&gt; </span><span><span class="hljs-variable">$value</span></span><span>) {
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>)) {
            </span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-keyword">from</span></span><span> </span><span><span class="hljs-title function_ invoke__">recursive_walk</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);  </span><span><span class="hljs-comment">// 재귀 적으로 하위 배열을 가로 지릅니다</span></span><span>
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> =&gt; </span><span><span class="hljs-variable">$value</span></span><span>;
        }
    }
}

</span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-title function_ invoke__">recursive_walk</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>) </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> =&gt; </span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$key</span></span></span><span> =&gt; </span><span><span class="hljs-subst">$value</span></span><span>\n";
}
</span></span>

발전기는 주문형 요소를로드하여 메모리 소비를 효과적으로 줄일 수 있습니다.

3. 참조를 직접 작동합니다

콜백 함수에서 새 변수 또는 객체를 생성하지 않고 원래 배열 요소의 값을 직접 수정하면 불필요한 메모리 오버 헤드를 피할 수 있습니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(&amp;</span><span><span class="hljs-variable">$item</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
    </span><span><span class="hljs-variable">$item</span></span><span> *= </span><span><span class="hljs-number">2</span></span><span>;  </span><span><span class="hljs-comment">// 원래 요소를 직접 수정하십시오</span></span><span>
});
</span></span>

4. 콜백 함수의 복잡성을 제어하십시오

콜백 함수에 의해 수행되는 작업이 가능한 한 간단하고 특히 재귀 적으로 호출 할 때 너무 많은 리소스 할당 또는 복잡한 계산을 수행하지 않도록하십시오. 콜백 함수에 반복적으로 생성 해야하는 리소스가있는 경우 각 재귀에서 반복적 인 생성을 피하십시오.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>], </span><span><span class="hljs-number">4</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">array_walk_recursive</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(&amp;</span><span><span class="hljs-variable">$item</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>) {
    </span><span><span class="hljs-built_in">static</span></span><span> </span><span><span class="hljs-variable">$multiplier</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>;  </span><span><span class="hljs-comment">// 정적 변수를 사용하여 일정한 값을 저장하십시오</span></span><span>
    </span><span><span class="hljs-variable">$item</span></span><span> *= </span><span><span class="hljs-variable">$multiplier</span></span><span>;
});
</span></span>

5. 적절한 배열 구조를 사용하십시오

때로는 배열 자체의 설계가 성능과 메모리 사용에 영향을 줄 수 있습니다. 너무 깊은 중첩 구조를 사용하지 마십시오. 가능하면 데이터 구조를 평평한 형태로 단순화하여 재귀의 복잡성을 줄입니다.

요약

Array_Walk_Recursive 는 매우 편리한 도구이지만, 특히 복잡한 양의 데이터를 다룰 때도주의를 기울여야합니다. 메모리 사용을 제어하고 불필요한 변수 및 객체를 청소하고 생성기 및 기타 최적화 전략을 채택하면 메모리 누출 문제를 효과적으로 피할 수 있습니다. 메모리 관리는 PHP 성능 최적화의 핵심 중 하나입니다. 합리적인 메모리 사용은 응용 프로그램의 안정성과 응답 속도를 크게 향상시킬 수 있습니다.