현재 위치: > 최신 기사 목록> GC_COLLECT_CYCLES로 Memory_Get_usage로 PHP 쓰레기 수집을 최적화하십시오

GC_COLLECT_CYCLES로 Memory_Get_usage로 PHP 쓰레기 수집을 최적화하십시오

gitbox 2025-05-28

PHP, 메모리 관리 및 쓰레기 수집 (GC)에서 성능 및 자원 활용 개선의 핵심 부분입니다. PHP의 자체 GC 메커니즘은 루프에서 참조하는 메모리를 자동으로 정리할 수 있지만 항상 최적의 것은 아닙니다. 동의 성 또는 긴 수명주기 스크립트에서 GC의 효율성은 응용 프로그램 성능에 직접 영향 미칩니다. GC_COLLECT_CYCLES ()를 수동으로 최적화하고 응용 프로그램의 메모리 사용 효율을 향상시킵니다.

PHP의 쓰레기 수집 메커니즘 소개

PHP는 5.3 이후 원형 참조의 탐지 및 청소 기능을 도입했습니다. 기본적으로 루트 버퍼에 기록 된 변수를 기반으로 한 GC 재활용 및 버퍼가 임계 값에 도달 할 때만 클렌징이 트리거됩니다. 이 메커니즘은 자동이지만 두 가지 문제가 있습니다.

  1. 항상 시간이 지남에 따라 트리거되는 것은 아니며 메모리 축적이 발생합니다.

  2. 수동 트리거링은 특정 시나리오 (예 : 긴 폴링 또는 데몬)에 더 적합 할 수 있습니다.

현재 Memory_get_usage ()gc_collect_cycles ()를 결합하여보다 유연한 메모리 관리를 수행 할 수 있습니다.

memory_get_usage의 역할

memory_get_usage ()는 현재 스크립트에서 사용하는 메모리 크기를 반환 할 수 있습니다. 이 기능을 정기적으로 호출하여 메모리 사용을 모니터링 할 수 있습니다.

 $startMemory = memory_get_usage();

작업이 처리 될 때마다 현재 메모리를 다시 가져옵니다.

 $endMemory = memory_get_usage();
echo "이 작업은 메모리를 사용합니다:" . ($endMemory - $startMemory) . " 바이트\n";

차이를 비교함으로써 비정상적인 메모리 성장이 있는지 판단 할 수 있습니다.

GC_COLLECT_CYCLES의 역할

GC_COLLECT_CYCLES ()는 즉시 쓰레기 ​​수집을 수행하고 재활용 된 사이클 참조 수를 반환합니다.

 $collected = gc_collect_cycles();
echo "수동으로 재활용 $collected 참조 변수。\n";

이 기능은 일반적으로 GC_Enabled ()gc_disable () 와 함께 사용하여 GC를보다 정밀하게 제어합니다.

 if (gc_enabled()) {
    gc_collect_cycles();
}

조합으로 사용 : 수동 가비지 수집 타이밍을 수동으로 제어하십시오

백그라운드 프로세스, 비동기 작업 스케줄러 또는 메시지 대기열 소비자와 같은 일부 특정 응용 시나리오에서는 메모리 누출이 시간이 지남에 따라 점차 축적됩니다. N 작업을 처리 한 후 Memory_Get_usage ()를 사용하여 메모리가 기대치를 초과하는지 확인한 다음 GC_COLLECT_CYCLES ()를 사용하여 수동으로 정리할 수 있습니다.

 $threshold = 10 * 1024 * 1024; // 10MB
$tasksProcessed = 0;

while (true) {
    $task = get_next_task(); // 대기열에서 작업을 받으십시오
    handle_task($task);
    $tasksProcessed++;

    if ($tasksProcessed % 100 === 0) {
        $currentMemory = memory_get_usage();
        echo "현재 메모리 사용:$currentMemory\n";

        if ($currentMemory > $threshold) {
            $collected = gc_collect_cycles();
            echo "메모리 임계 값에 도달했습니다,수동 쓰레기 재활용,출시된 $collected 변수。\n";
        }
    }
}

get_next_task ()handle_task () 는 실제 비즈니스에 따라 정의하는 기능입니다. 예를 들어, gitbox.net 에 배포 한 데몬 서비스 에서이 방법을 사용하여 스크립트가 오랫동안 너무 많은 메모리를 소비하지 않도록 할 수 있습니다.

주목해야 할 것

  1. GC_COLLECT_CYCLES ()를 수동으로 호출하는 것은 자유롭지 않습니다. 특히 많은 변수가있을 때 GC는 추가 성능 오버 헤드를 가져옵니다.

  2. memory_get_usage ()는 할당 된 메모리를 반환하며 반드시 사용 가능한 메모리를 반드시 반영 할 필요는 없습니다.

  3. gc_disable ()을 사용한 후에는 적절한 시간에 gc_enable ()을 다시 확인하십시오. 그렇지 않으면 메모리가 계속 커집니다.

요약

메모리 사용량을 모니터링하고 적시에 쓰레기 수집을 수동으로 트리거하여 PHP의 메모리 관리, 특히 장기적인 서비스 또는 스크립트에 대해 크게 최적화 할 수 있습니다. Memory_get_usage ()gc_collect_cycles () 의 합리적인 조합은 많은 작업을 처리 할 때 PHP 응용 프로그램을보다 안정적이고 효율적으로 만들 수 있습니다.