현재 위치: > 최신 기사 목록> Session_GC를 통해 PHP 응용 프로그램의 성능을 향상시키는 방법은 무엇입니까?

Session_GC를 통해 PHP 응용 프로그램의 성능을 향상시키는 방법은 무엇입니까?

gitbox 2025-05-29

1. Session_GC 란 무엇입니까?

Session_GC () 는 PHP의 내부 기능이며, 그 기능은 세션의 쓰레기 수집 메커니즘을 실행하는 것입니다. PHP는 만료 된 세션 파일을 정리할 수있는 사용자 요청에서 특정 확률 로이 기능을 트리거합니다. 기본 동작은 다음 세 가지 구성 항목에 의해 결정됩니다.

 ini_get('session.gc_probability'); // 기본값:1
ini_get('session.gc_divisor');     // 기본값:100
ini_get('session.gc_maxlifetime'); // 기본값:1440 두번째(24 분)

즉, 100 개의 요청마다 Session_GC가 트리거 될 확률이 있습니다 .

2. Session_GC가 성능에 미치는 영향

1. 파일 시스템의 병목 현상

PHP는 기본적으로 서버 파일 시스템의 세션 데이터를 기본적으로 저장합니다 (일반적으로 /tmp 디렉토리). Session_GC가 실행될 때마다 PHP는이 디렉토리의 모든 세션 파일을 스캔하여 만료 된 세션을 결정해야합니다. 이 작업은 세션 파일 수가 적을 때 무감각하지만 동시성이 높거나 세션 보유 시간이 길면 상당한 I/O 간접비로 이어질 수 있습니다.

2. 잠금 경쟁 문제

여러 요청이 트리거 세션_GC를 동시에 트리거하는 경우 잠금 경쟁이 발생하여 요청 막힘이 발생할 수 있습니다. 이것은 특히 높은 일환 시스템에서 위험합니다. 적어도 응답 속도를 줄이고 최악의 경우 서버로드를 직접 채 웁니다.

3. Session_GC의 최적화 전략

1. 자동 GC를 끄고 대신 시간이 지정된 작업 처리를 사용하십시오.

가장 일반적인 접근 방식은 PHP의 자동 GC를 끄는 것입니다. 시스템이 더 통제 된 방식으로 (예 : CRON 타이밍 작업)를 수집 할 수 있도록하는 것입니다.

 ini_set('session.gc_probability', 0);

그런 다음 5 분마다 청소 로직 수행과 같은 시간이 지정된 작업을 설정합니다.

 */5 * * * * php /var/www/html/session_gc.php

session_gc.php 샘플 코드는 다음과 같습니다.

 <?php
ini_set('session.save_path', '/var/www/html/sessions');
ini_set('session.gc_maxlifetime', 3600); // 만료 시간을 설정하십시오
session_start();
session_gc(); // 수동으로 정리를 수행하십시오

2. 데이터베이스 또는 메모리 내 스토리지를 사용하여 파일 시스템을 대체합니다.

Session.save_handler를 Memcached 또는 Redis 로 구성함으로써 세션의 읽기 효율을 크게 향상시킬 수 있으며 PHP 파일 시스템 GC의 성능 문제는 이러한 시스템의 기본 만기 전략을 피할 수 있습니다.

 ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');

Redis의 자체 TTL 메커니즘은 수동 개입없이 만료 된 세션을 자동으로 삭제할 수 있습니다.

3. Session_Lazy_GC 사용 (PHP 7.1+)

PHP 7.1에서 시작하여 Session.lazy_write 구성 항목이 추가되었으며 세션 파일은 세션 데이터가 변경 될 때만 작성됩니다. Session_GC와 직접적인 관계는 없지만 불필요한 쓰기 작업을 줄이고 성능을 간접적으로 개선 할 수 있습니다.

 ini_set('session.lazy_write', 1);

4. 실제 사례 : 대규모 쇼핑몰 플랫폼의 최적화 실무

방문한 B2C 몰에서는 원래 구성으로 인해 수십만 개의 세션 파일이 /TMP 에서 축적되었습니다. 각 세션_GC 실행으로 인해 CPU가 급증하고 페이지 응답 시간이 크게 증가했습니다.

최적화 계획은 다음과 같습니다.

  1. 자동 GC를 끄십시오.

  2. Redis를 사용하여 세션을 저장하십시오.

  3. 백그라운드 작업은 매일 오전 2시에 Session_GC () (대체)을 실행합니다.

  4. 로그인 유효성 기간을 연장하려면 세션을 7200 초로 조정하십시오.

온라인으로 가면 전체 시스템 응답 시간은 평균 30% 감소했으며 GC 실행 시간은 몇 초에서 수십 밀리 초로 단축되었습니다.

V. 결론

Session_GC 는 "백엔드 작업"이지만 기본 동작이 높은 동시성 시나리오에서 성능 병목 현상이 될 수 있습니다. 실제 비즈니스 시나리오를 기반으로 원칙을 이해하고 구성을 사용자 정의하면 PHP 응용 프로그램의 안정성과 성능을 효과적으로 향상시킬 수 있습니다.

모범 사례 요약 :

  • 대규모 프로젝트에서 자동 GC를 비활성화하고 타이밍 작업을 사용하십시오.

  • Redis/Memcached를 사용하여 세션을 저장하십시오.

  • 합리적인 구성으로 GC_MAXLIFETIME을 구성하십시오.

  • 디스크 쓰기를 줄이려면 세션을 사용합니다.

이러한 기술을 마스터하는 것은 더 이상 성능 단점이 아닙니다.