PHP 대용량 데이터 처리 속도 개선하기

프리터코더·2025년 5월 27일

php 문제 해결

목록 보기
38/79

PHP로 대용량 데이터를 처리할 때 속도가 느려지는 것은 흔한 문제입니다. 이 문제를 해결하는 효과적인 방법들을 알아보겠습니다.

1. 메모리 효율적인 파일 읽기

문제: file_get_contents()로 큰 파일을 읽으면 메모리 부족 발생

해결책: 스트림을 사용해 청크 단위로 처리

$handle = fopen('large_file.csv', 'r');
while (($line = fgets($handle)) !== false) {
    // 한 줄씩 처리
    processLine($line);
}
fclose($handle);

2. 배치 처리로 DB 성능 향상

문제: 대량 데이터를 하나씩 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 = [];
    }
}

3. 제너레이터로 메모리 사용량 줄이기

문제: 큰 배열을 메모리에 모두 로드하면 메모리 초과

해결책: 제너레이터 사용

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);
}

4. 병렬 처리로 속도 향상

문제: 순차 처리로 인한 긴 처리 시간

해결책: 멀티프로세싱 사용

$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);

5. 적절한 PHP 설정 조정

문제: 기본 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
profile
일용직 개발자. freetercoder@gmail.com

0개의 댓글