PHP로 대용량 데이터를 처리할 때 속도가 느려지는 것은 흔한 문제입니다. 이 문제를 해결하는 효과적인 방법들을 알아보겠습니다.
문제: file_get_contents()로 큰 파일을 읽으면 메모리 부족 발생
해결책: 스트림을 사용해 청크 단위로 처리
$handle = fopen('large_file.csv', 'r');
while (($line = fgets($handle)) !== false) {
// 한 줄씩 처리
processLine($line);
}
fclose($handle);
문제: 대량 데이터를 하나씩 INSERT하면 매우 느림
해결책: 배치 INSERT 사용
$values = [];
foreach ($data as $row) {
$values[] = "({$row['id']}, '{$row['name']}', '{$row['email']}')";
if (count($values) >= 1000) {
$sql = "INSERT INTO users (id, name, email) VALUES " . implode(',', $values);
$pdo->exec($sql);
$values = [];
}
}
문제: 큰 배열을 메모리에 모두 로드하면 메모리 초과
해결책: 제너레이터 사용
function readLargeDataset($filename) {
$handle = fopen($filename, 'r');
while (($line = fgets($handle)) !== false) {
yield json_decode($line, true);
}
fclose($handle);
}
foreach (readLargeDataset('data.json') as $record) {
processRecord($record);
}
문제: 순차 처리로 인한 긴 처리 시간
해결책: 멀티프로세싱 사용
$chunks = array_chunk($largeArray, 1000);
foreach ($chunks as $chunk) {
$pid = pcntl_fork();
if ($pid == 0) {
// 자식 프로세스에서 청크 처리
processChunk($chunk);
exit(0);
}
}
// 모든 자식 프로세스 완료 대기
while (pcntl_waitpid(0, $status) != -1);
문제: 기본 PHP 설정으로 인한 제한
해결책: 메모리와 실행 시간 제한 조정
ini_set('memory_limit', '512M');
ini_set('max_execution_time', 300);
set_time_limit(0); // 무제한 실행 시간
// 또는 php.ini에서 설정
// memory_limit = 512M
// max_execution_time = 300