PHP PHP에서 고성능 파일 업로드 처리 기법
페이지 정보

영삼이
본문
✅ 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 자체는 단일 요청 처리만 지원하므로, 프론트에서 파일을 조각내어 전송하고, 서버에서 합치는 방식을 사용해야 함
청크 업로드 기본 흐름
-
JS로 파일을 조각(예: 1MB 단위)
-
각각을 AJAX로 PHP에 업로드
-
PHP는 조각을 순서대로 임시 저장
-
모든 조각 수신 후 하나로 합침
[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()
에서 탈피해 구조적으로 설계하자
- 이전글PHP에서 비동기 처리를 흉내내는 방법 25.03.28
- 다음글PHP에서 SPL 자료구조 적극 활용하기 25.03.28
댓글목록
등록된 댓글이 없습니다.