HOWTO · PHP
PHP의 최대 업로드 크기
오늘의 게시물은 PHP의 최대 업로드 크기를 다룰 것입니다.
이 페이지의 내용
더 큰 파일 업로드를 허용하려면 파일별 PHP upload_max_filesize 값을 높이고, 전체 요청을 처리할 수 있도록 post_max_size 값도 충분히 설정해야 합니다. 먼저 업로드를 처리하는 프로세스가 사용하는 PHP 구성을 확인하고, 그곳에 설정을 적용한 뒤 같은 프로세스에서 적용 여부를 확인하세요. 설정 파일의 위치와 변경 사항을 적용하는 방법은 PHP 설치 및 호스팅 환경에 따라 다릅니다.
현재 적용 중인 PHP 구성 찾기
PHP는 php.ini에서 설정을 읽을 수 있습니다. 명령줄 PHP가 사용하는 파일은 웹 서버나 PHP-FPM이 사용하는 파일과 다를 수 있으므로, 업로드를 받는 PHP 프로세스의 구성을 확인하세요. 명령줄 PHP에서는 php --ini가 로드된 구성 파일을 보여 줍니다. 웹 요청에서는 php_ini_loaded_file()을 호출하는 임시 스크립트로 로드된 파일을 확인할 수 있습니다. 구성 정보가 공개된 채 남지 않도록 확인을 마치면 그 스크립트를 삭제하세요.
php.ini에는 일반적으로 PHP 설치나 런타임에 적용되는 설정이 들어 있습니다. 일부 웹 서버 구성은 .htaccess를 통한 디렉터리별 재정의도 허용하지만, 지원 여부는 서버와 PHP 연동 방식에 따라 달라집니다. PHP 자체가 .htaccess를 제공하는 것은 아니며, 호스팅 업체가 재정의를 비활성화했을 수도 있습니다. 해당 파일이나 서비스를 직접 관리하지 않는다면 호스팅 제어판을 이용하거나 관리자에게 변경 가능한 설정을 문의하세요.
upload_max_filesize 설정
이 지시어는 업로드 파일 하나의 크기를 제한합니다. 현재 적용 중인 구성을 편집하고 허용하려는 가장 큰 파일에 맞는 값을 지정하세요. 예를 들어 upload_max_filesize = 32M으로 설정하면 파일별 제한은 32메가바이트가 됩니다. PHP 크기 값에는 보통 K, M, G를 사용합니다. PHP 구성과 호스트에서 지원하는 값을 선택하세요. 예시 값이 현재 기본값이라고 가정하거나, 이 값을 바꾸면 서버의 모든 PHP 런타임에 적용된다고 생각하지 마세요.
전체 요청에 맞게 post_max_size 설정
post_max_size는 멀티파트 폼 데이터와 요청에 포함된 다른 파일을 비롯해 HTTP 요청 본문 전체의 크기를 제한합니다. 폼 필드와 멀티파트 오버헤드에 대비할 여유를 두고 upload_max_filesize보다 큰 값으로 설정하세요. 예를 들어 파일 제한이 32메가바이트라면 요청 제한을 40M으로 설정해 여유를 둘 수 있습니다. 요청 제한이 너무 작으면 파일 자체가 upload_max_filesize보다 작더라도 PHP가 업로드 파일을 애플리케이션에 전달하지 못할 수 있습니다. memory_limit은 이 두 설정에 반드시 적용되는 상한이 아닙니다. 필요한 메모리 양은 애플리케이션이 업로드 파일을 처리하는 방식에 따라 달라집니다.
변경 사항 적용
업로드를 받는 PHP 프로세스에 적용되는 구성 파일이나 재정의를 저장하세요. 호스트 환경에 따라 변경 사항이 즉시 적용되거나 웹 서버, PHP-FPM 또는 다른 PHP 서비스를 다시 불러오거나 재시작해야 할 수 있습니다. 호스팅 환경에 맞는 절차를 따르세요. 새 명령을 실행할 때마다 명령줄 PHP를 재시작할 필요는 없지만, 계속 실행 중인 서비스는 설정을 다시 불러와야 할 수 있습니다. 공유 호스팅에서는 서버 파일을 직접 편집하는 대신 제어판에서 값을 바꿔야 할 수도 있습니다.
적용된 제한 값 확인
업로드를 처리하는 환경에서 두 값을 모두 확인하세요. 짧은 PHP 스크립트로 해당 프로세스가 인식하는 값을 확인할 수 있습니다.
이 예제는 필요한 코드가 모두 포함되어 있지만, 이 패킷에서는 실행 여부가 검증되지 않았습니다. 코드에 표시되는 지시어 이름과 출력 레이블은 코드 바이트 보존을 위해 영어 그대로 유지됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
foreach (['upload_max_filesize', 'post_max_size'] as $name) {
echo $name, '=', ini_get($name), PHP_EOL;
}
웹 설정을 확인하려면 관련 웹 런타임을 통해 스크립트를 실행하세요. 터미널에서 실행하면 웹 PHP가 아니라 명령줄 PHP의 설정을 확인하게 됩니다. 확인을 마치면 임시 진단 페이지를 삭제하세요. 표시된 값이 바뀌지 않았다면 실제로 로드된 구성 파일을 편집했는지, 올바른 서비스에 변경 사항을 적용했는지 확인하세요.
업로드 실패가 계속될 때 문제 해결
업로드가 거부되면 파일 크기를 upload_max_filesize와 비교하고 요청 전체 크기는 post_max_size와 비교하세요. “The uploaded file exceeds the upload_max_filesize directive in php.ini”와 같은 오류는 파일별 PHP 제한이 원인일 수 있지만, 표시 문구는 환경에 따라 달라질 수 있습니다. 표시된 제한 값이 여전히 낮다면 로드된 파일과 관련 서비스에 변경 사항이 적용되었는지 확인하세요. PHP가 의도한 값을 보고하는데도 업로드가 실패한다면 웹 서버, 프록시, 호스팅 플랫폼 또는 애플리케이션 규칙 같은 다른 계층에서 더 낮은 제한을 적용하고 있을 수 있습니다. 해당 계층의 설정과 로그를 확인하고, 제한을 직접 바꿀 수 없다면 호스트에 문의하세요. 요청 제한은 파일 제한보다 높게 유지하고 실제 업로드와 같은 경로 및 PHP 런타임에서 다시 확인하세요.