워드프레스 업로드

워드프레스 업로드 용량 2MB 제한 해제 upload max filesize 8GB

워드프레스 업로드 용량 제한 해제 및 늘리는 스크립트입니다

워드프레스 업로드 소스코드 분석 및 설명

1. 파일 업로드 및 스크립트 실행 설정 변수

워드프레스 업로드 소스코드의 첫 부분에는 웹사이트에서 관리할 중요한 설정 변수들이 선언되어 있습니다.

이 변수들은 웹사이트의 파일 업로드와 관련된 기능의 동작 방식을 결정하는 핵심적인 역할을 합니다.

  • $max_upload_size: 이 변수는 웹사이트에서 사용자가 업로드할 수 있는 파일의 최대 크기를 결정합니다. 기본값으로 ‘8G’가 설정되어 있어, 사용자는 최대 8기가바이트 크기의 파일을 업로드할 수 있습니다.
  • $max_post_size: 웹사이트에서 처리할 수 있는 POST 요청의 최대 데이터 크기를 정의하는 변수입니다. ‘8G’라는 값은 사용자가 웹페이지로 전송할 수 있는 POST 데이터의 최대 크기를 8기가바이트로 제한한다는 것을 의미합니다. 이는 파일 업로드 외에도 다양한 웹 폼 데이터 전송 시에 적용될 수 있습니다.
  • $max_execution_time: 웹 서버에서 스크립트가 실행될 때 허용되는 최대 실행 시간을 지정하는 변수입니다. ‘1200’이라는 값은 스크립트가 최대 1200초, 즉 20분 동안 실행될 수 있음을 나타냅니다. 이를 통해 긴 작업을 수행하는 스크립트의 실행이 중간에 중단되는 것을 방지할 수 있습니다.
  • $max_input_time: 스크립트가 입력 데이터(예: POST 데이터)를 처리하는데 허용되는 최대 시간을 설정하는 변수입니다. ‘1200’이라는 값은 입력 데이터의 처리 시간을 최대 20분까지 허용한다는 것을 의미합니다. 큰 파일이나 많은 양의 데이터를 전송할 때 중요한 설정이 될 수 있습니다.

이러한 변수들을 통해 웹사이트의 성능과 사용자 경험을 최적화하고, 웹사이트 관리자는 웹서비스의 동작 방식을 조절할 수 있게 됩니다.

2. 관리자 대시보드에서의 .htaccess 파일 업데이트

관리자 대시보드에 로그인한 사용자만이 .htaccess 파일을 수정할 수 있습니다.

함수 update_htaccess_for_upload_settings는 주어진 설정 값을 이용하여 .htaccess 파일 내의 관련 설정을 업데이트합니다.

이 함수는 기존 설정 값을 삭제한 후 새로운 값으로 업데이트하는 방식으로 동작합니다.

3. 관리자 대시보드 초기화 동작에서 .htaccess 업데이트

admin_init 액션 훅을 이용하여 관리자 대시보드가 초기화될 때마다 .htaccess 파일이 업데이트되도록 설정되어 있습니다.

해당 부분에서는 워드프레스의 관리자 대시보드에 로그인한 사용자가 대시보드에 접속할 때마다 .htaccess 파일을 업데이트하는 로직이 포함되어 있습니다.

함수 update_htaccess_for_upload_settings를 사용하여 .htaccess 파일에 웹서버의 특정 설정들을 업데이트합니다.

워드프레스 업로드 함수는 다음 순서로 동작:

  1. 서버의 루트 디렉토리에 위치한 .htaccess 파일의 경로를 찾습니다.
  2. 파일이 존재하는 경우, 해당 파일의 내용을 읽어옵니다.
  3. 기존에 설정된 upload_max_filesize, post_max_size, max_execution_time, 그리고 max_input_time 값을 파일에서 제거합니다.
  4. 새로 설정된 값들을 파일의 끝에 추가합니다.
  5. 수정된 내용을 .htaccess 파일에 다시 저장합니다.

이렇게 매번 관리자 대시보드에 접속할 때마다 .htaccess 파일을 수정하면, 서버의 I/O 연산이 빈번하게 발생하게 되며, 이는 서버에 부하를 주게 됩니다.

부하를 줄이는 방안 제안:

  1. 설정 값 변경 감지: .htaccess 파일을 수정할 필요가 있을 때만 수정하는 로직을 구현할 수 있습니다. 설정 값이 변경되었는지를 감지하고, 변경이 감지될 때만 .htaccess 파일을 업데이트합니다.
  2. 캐싱: .htaccess 파일의 내용을 서버 메모리에 캐싱하고, 변경이 필요할 때만 파일을 수정하는 방식을 고려할 수 있습니다.
  3. 관리자 인터페이스에서 명시적인 저장 버튼 제공: 대시보드 내에서 .htaccess 업데이트를 위한 명시적인 “저장” 버튼을 제공하고, 사용자가 이 버튼을 클릭했을 때만 설정을 저장하는 방식을 채택할 수 있습니다. 이렇게 하면 불필요한 파일 수정 연산을 줄일 수 있습니다.
  4. 설정 변경 로그: 변경 내역을 로깅하고, 실제 파일 수정이 필요한 경우에만 알림을 주는 방식을 구현할 수 있습니다. 이를 통해 관리자가 필요할 때만 파일을 수정하도록 할 수 있습니다.

이러한 방법들을 적용함으로써 서버 부하를 최소화하면서도 원활한 설정 관리를 할 수 있게 됩니다.

4. 워드프레스 업로드 파일 설정 상태 확인 페이지

display_upload_settings 함수는 웹사이트의 /check-upload 경로로 접속했을 때 현재 파일 업로드 및 스크립트 실행 설정 상태를 HTML 형식으로 표시합니다.

// 이 코드는 수정 중 에러가 발생할 경우 소스 복구 비용 10만원이 추가되므로 절대 수정하지 마시기 바랍니다!!
// 아래 링크를 통해 사용방법을 꼭 확인하고 사용하세요!! - 프로그래머 문호영
// https://snippets.stofarm.com/upload_maxfilesize

// 용량과 시간 설정
$max_upload_size = '1G';
$max_post_size = '1G';
$max_execution_time = '1200';
$max_input_time = '1200';

// 관리자 대시보드에서만 .htaccess 업데이트
if (is_admin()) {
	function update_htaccess_for_upload_settings($max_upload_size, $max_post_size, $max_execution_time, $max_input_time) {
		$htaccessPath = $_SERVER['DOCUMENT_ROOT'] . '/.htaccess';

		if (file_exists($htaccessPath)) {
			$original_content = file_get_contents($htaccessPath);

			// 여기에 $patterns_to_delete 변수를 선언합니다.
			$patterns_to_delete = [
				'/php_value\s+upload_max_filesize\s+\S+/',
				'/php_value\s+post_max_size\s+\S+/',
				'/php_value\s+max_execution_time\s+\d+/',
				'/php_value\s+max_input_time\s+\d+/'
			];

			// 기존 내용에 우리의 설정값이 있으면 그것만 제거
			foreach ($patterns_to_delete as $pattern) {
				$original_content = preg_replace($pattern, "", $original_content);
			}

			// 기존 내용과 새로운 설정값을 합쳐서 .htaccess 파일에 쓴다.
			$updated_content = trim($original_content);
			$updated_content .= "\nphp_value upload_max_filesize " . $max_upload_size;
			$updated_content .= "\nphp_value post_max_size " . $max_post_size;
			$updated_content .= "\nphp_value max_execution_time " . $max_execution_time;
			$updated_content .= "\nphp_value max_input_time " . $max_input_time;

			file_put_contents($htaccessPath, $updated_content);
		}
	}



	add_action('admin_init', function() use ($max_upload_size, $max_post_size, $max_execution_time, $max_input_time) {
		update_htaccess_for_upload_settings($max_upload_size, $max_post_size, $max_execution_time, $max_input_time);
	});

}

function display_upload_settings($max_upload_size, $max_post_size, $max_execution_time, $max_input_time) {
    if ($_SERVER['REQUEST_URI'] == '/check-upload') {
        echo '<!DOCTYPE html>
        <html lang="ko">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>파일 업로드 설정 상태</title>
            <style>
                body { font-family: Arial, sans-serif; background-color: #f4f4f4; height: 100vh; display: flex; align-items: center; justify-content: center; }
                .container { background-color: #fff; padding: 40px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); width: 80%; max-width: 600px; text-align: center; }
                h1 { font-size: 24px; margin-bottom: 20px; }
                p { font-size: 18px; margin-bottom: 10px; }
                .info-button { display: inline-block; background-color: #007BFF; color: #FFFFFF; padding: 10px 20px; border-radius: 5px; text-decoration: none; font-weight: bold; margin-top: 20px; }
            </style>
        </head>
        <body>
            <div class="container">
                <h1>파일 업로드 설정 상태</h1>
                <p><strong>upload_max_filesize:</strong> ' . $max_upload_size . '</p>
                <p><strong>post_max_size:</strong> ' . $max_post_size . '</p>
                <p><strong>max_execution_time:</strong> ' . $max_execution_time . '</p>
                <p><strong>max_input_time:</strong> ' . $max_input_time . '</p>
                <a href="https://snippets.stofarm.com/upload_maxfilesize" target="_blank" class="info-button">FileMaxSize 사용설명 바로 확인</a>
            </div>
        </body>
        </html>';
        exit;
    }
}

add_action('template_redirect', function() use ($max_upload_size, $max_post_size, $max_execution_time, $max_input_time) {
	display_upload_settings($max_upload_size, $max_post_size, $max_execution_time, $max_input_time);
});

5. 템플릿 리다이렉트 동작에 대한 설정 상태 확인 페이지 호출

template_redirect 액션 훅을 이용하여 웹사이트의 /check-upload 경로에 대한 요청이 있을 때 display_upload_settings 함수를 호출하여 설정 상태 확인 페이지를 표시하도록 설정되어 있습니다.

워드프레스 업로드 스니핏 다운로드 정보

json 파일 다운받기

잘 사용하세요^^