메모리 관리 및 성능 팁
메모리를 일찍 해제하고 큰 배열 복사를 피하며 대규모 데이터에는 생성기를 사용합니다.
메모리 관리 및 성능 팁은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
PHP 메모리 관리
PHP는 가비지 컬렉션을 위해 순환 수집기가 포함된 참조 카운팅을 사용합니다. 각 요청은 새로운 힙으로 시작하지만, 장시간 실행되는 프로세스(워커, Horizon)에서는 메모리 누수가 누적될 수 있습니다.
memory_limit
php.ini에서 적절한 메모리 제한을 설정합니다. 제한을 초과하면 치명적인 오류가 발생합니다.
# php.ini:
memory_limit = 256M
// Check at runtime:
echo memory_get_usage(true) / 1024 / 1024 . " MB";
echo memory_get_peak_usage(true) / 1024 / 1024 . " MB peak";큰 변수 설정 해제
장시간 실행되는 함수 안에서 큰 배열이나 객체가 더 이상 필요하지 않으면 메모리를 명시적으로 해제합니다.
<?php
$data = loadLargeDataset();
processData($data);
unset($data); // free immediately, do not wait for end of scope
gc_collect_cycles(); // force garbage collection if circular references대규모 데이터 집합을 위한 제너레이터
모든 데이터를 메모리에 로드하지 않고 큰 파일이나 쿼리 결과를 한 행씩 처리하려면 제너레이터를 사용합니다.
<?php
function readCsvLines(string $file): Generator {
$fh = fopen($file, "r");
while (($line = fgetcsv($fh)) !== false) {
yield $line;
}
fclose($fh);
}
foreach (readCsvLines("large.csv") as $row) {
importRow($row);
}큰 배열 복사 피하기
PHP는 배열에 쓰기 시 복사 방식을 사용합니다. 배열을 변수에 할당해도 둘 중 하나가 수정될 때까지 복사되지 않습니다. 변경이 필요하면 큰 배열을 참조로 전달합니다.
<?php
function processArray(array &$data): void {
// & avoids a copy when the parameter is modified
}반복문에서 문자열 연결
매우 긴 문자열을 반복문에서 연결하여 만드는 것은 비효율적입니다. 배열과 implode()를 사용합니다.
<?php
// Slow for large N:
$str = "";
foreach ($items as $item) $str .= $item->format()."\n";
// Faster:
$parts = [];
foreach ($items as $item) $parts[] = $item->format();
$str = implode("\n", $parts);객체 생성 캐싱
반복 횟수가 많은 루프에서 객체를 인스턴스화하는 작업은 특히 생성자 로직이 포함되면 비용이 큽니다. 가능한 경우 인스턴스를 캐시하거나 플라이웨이트 객체를 사용하십시오.
함수 호출 반복 피하기
반복마다 결과가 달라지지 않는 함수 호출은 루프 밖으로 옮기십시오.
<?php
// Slow:
for ($i = 0; $i < count($items); $i++) { ... }
// Fast (count() called once):
$n = count($items);
for ($i = 0; $i < $n; $i++) { ... }PHP-FPM 작업자 조정
사용 가능한 메모리와 예상 동시 실행 수를 기준으로 PHP-FPM 작업자 수를 구성하십시오. 대략적인 규칙은 작업자 수 = RAM / (평균 작업자 메모리 사용량)입니다.
OPcache 및 사전 로드
OPcache를 활성화하고(이전 lesson에서 다룸) 자주 사용하는 프레임워크 클래스를 사전 로드하십시오. 이렇게 하면 요청마다 발생하는 구문 분석 및 컴파일 비용이 제거됩니다.
먼저 프로파일링하기
항상 최적화하기 전에 프로파일링하십시오. 병목이 아닌 코드에 적용한 미세 최적화는 시간을 낭비하고 가독성을 떨어뜨립니다. Xdebug 또는 Blackfire를 사용하여 실제 병목 경로를 찾으십시오.
요약
대규모 데이터 집합에는 생성기를 사용하십시오. 작업이 끝난 변수는 해제하십시오. 큰 배열을 복사하지 마십시오. 변하지 않는 호출은 루프 밖으로 옮기십시오. 최적화하기 전에 Xdebug로 프로파일링하여 실제 병목을 찾으십시오.
빠른 확인
대규모 데이터 집합에서 PHP 생성기를 사용하는 가장 큰 이점은 무엇입니까?
자주 묻는 질문
“메모리 관리 및 성능 팁” 강의는 무료인가요?
네 — “메모리 관리 및 성능 팁” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“메모리 관리 및 성능 팁”에서 뭘 배우나요?
메모리를 일찍 해제하고 큰 배열 복사를 피하며 대규모 데이터에는 생성기를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
PHP Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“메모리 관리 및 성능 팁” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Xdebug로 PHP 프로파일링
- OPcache: 바이트코드 캐싱
- 데이터베이스 쿼리 최적화
- 메모리 관리 및 성능 팁