개발 지식

개발 지식

PHP PHP에서 고성능 파일 업로드 처리 기법

페이지 정보

profile_image
영삼이
0건 187회 25-03-28 23:15

본문

✅ PHP에서 고성능 파일 업로드 처리 기법

파일 업로드는 거의 모든 웹 애플리케이션에 필요한 기능입니다. 그러나 고용량 파일, 대용량 동시 업로드, 보안 문제 등을 고려하지 않으면 성능과 안정성에 문제가 생깁니다. 이 글에서는 PHP에서 실무에 적합한 고성능 파일 업로드 처리 기법을 소개합니다.


📁 1. php.ini 설정 최적화

[code]
; 허용 최대 파일 크기
upload_max_filesize = 100M

; POST 요청 최대 크기 (파일 + 기타 데이터 포함)
post_max_size = 110M

; 임시 저장 디렉토리 설정 (속도 빠른 디스크 추천)
upload_tmp_dir = /tmp/php_uploads

; 파일 업로드 허용
file_uploads = On
[/code]
  • upload_max_filesize < post_max_size 유지

  • SSD 디렉토리에 upload_tmp_dir 설정 시 성능 향상


🚀 2. 대용량 업로드 대응: 청크 업로드 (chunked)

PHP 자체는 단일 요청 처리만 지원하므로, 프론트에서 파일을 조각내어 전송하고, 서버에서 합치는 방식을 사용해야 함

청크 업로드 기본 흐름

  1. JS로 파일을 조각(예: 1MB 단위)

  2. 각각을 AJAX로 PHP에 업로드

  3. PHP는 조각을 순서대로 임시 저장

  4. 모든 조각 수신 후 하나로 합침

[code=php]
// upload_chunk.php
$chunk = $_FILES['file']['tmp_name'];
$index = $_POST['chunkIndex'];
$uuid = $_POST['uploadId'];

$path = __DIR__ . "/uploads/{$uuid}_part_{$index}";
move_uploaded_file($chunk, $path);
[/code]
[code=php]
// merge_chunks.php
$uuid = $_POST['uploadId'];
$total = $_POST['totalChunks'];
$target = fopen("uploads/{$uuid}_merged.mp4", 'wb');

for ($i = 0; $i < $total; $i++) {
    $part = file_get_contents("uploads/{$uuid}_part_{$i}");
    fwrite($target, $part);
    unlink("uploads/{$uuid}_part_{$i}");
}

fclose($target);
[/code]

🛡 3. 보안 필수 체크

[code=php]
$allowedTypes = ['image/png', 'image/jpeg', 'application/pdf'];

if (!in_array($_FILES['file']['type'], $allowedTypes)) {
    die('허용되지 않는 파일 형식입니다.');
}

if ($_FILES['file']['size'] > 100 * 1024 * 1024) {
    die('파일 크기 초과');
}
[/code]
  • MIME 타입 + 확장자 동시 검사

  • 임의 확장자 우회 주의 (ex: .php.jpg)


📦 4. 파일명 안전하게 처리

[code=php]
$name = pathinfo($_FILES['file']['name'], PATHINFO_FILENAME);
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

$safeName = preg_replace('/[^a-zA-Z0-9_-]/', '_', $name);
$final = uniqid($safeName . '_') . '.' . $ext;

move_uploaded_file($_FILES['file']['tmp_name'], "uploads/{$final}");
[/code]
  • 사용자 업로드 파일명 신뢰 금지

  • 무작위 또는 해시 기반 파일명 사용 권장


✅ 성능 최적화 요약

항목 설명
php.ini 조정 파일 크기, 메모리 등 서버 한계 설정
청크 업로드 대용량 파일 처리 핵심
보안 검사 MIME + 크기 + 확장자 체크
디스크 I/O 최적화 SSD 사용, 업로드 디렉토리 분리
파일명 필터링 이름 충돌, 악성 코드 실행 방지

🧠 요약

  • PHP는 기본적으로 싱글 요청 기반 → 청크 업로드로 대용량 대응

  • 보안과 성능을 동시에 고려한 업로드 로직이 실무에서 필수

  • 단순한 move_uploaded_file()에서 탈피해 구조적으로 설계하자


댓글목록

등록된 댓글이 없습니다.