본문 바로가기
프로그래밍

PHP 갑작스럽게 500 에러가 발생하였다면? - max_execution_time 설정

by K-인사이터 2024. 2. 22.
반응형

안녕하세요

K-IN 입니다. 

 

PHP 웹 서버에서 갑작스럽게 500 에러가 발생하는 경우가 있습니다. 

Legacy PHP 코드라면 에러 메시지가 출력되지 않기도 합니다. 

 

만약, PHP-FPM 및 NGINX 조합을 사용하고 있다면 어디에서 에러가 발생했는지도 애매할 것입니다. 

 

PHP 언어는 유연한 문법을 제공하는데요.

낮은 버전의 PHP 언어를 사용한다면 수 많은 Warning, Notice 레벨의 에러로 인해서 제대로 디버깅이 힘들 것입니다. 

 

이번에는 max_execution_time 사례를 가져왔는데요.

해당 설정과 관련된 전형적인 증상은 아래와 같습니다. 

 

 

외부 파일을 읽어오는 과정에서 갑자기 500에러가 발생했어요 
외부 API를 호출하는 로직인데 500에러가 발생했어요. 
리포트를 생성하는 API인데 500에러가 발생했어요. 
등등 

 

위 사례의 공통점은 "오래 걸릴 가능성이 있는 작업"입니다. 

 

에러 메시지를 확인하는 방법

때때로 모든 에러 메시지들을 출력하지 않도록 설정하는 경우가 있습니다. 

따라서, 관련 PHP 소스파일의 맨위 상단에 아래의 설정을 합니다. 

 

 

E_ALL은 모든 에러를 의미합니다.

그리고 ini_set 함수는 php.ini 설정 파일에 전역적으로 설정하기 어려운 설정을 할때 사용됩니다. 

예를 들어, AA/BB.php 경로에서만 모든 에러를 출력하도록 설정하기를 원하는 경우입니다. 

 

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'On');

 

Maximum execution time exceeds 에러 메시지 및 조치 방법

display_errors 설정을 On 으로 변경하였다면, 다시 500 에러가 발생한 API 를 호출합니다. 

일정 시간이 지나고 아래와 같은 에러가 출력될 것입니다. 

 

Fatal error: Maximum execution time of 30 seconds exceeded

 

아무런 설정을 하지 않았다면 max_execution_time 설정은 30입니다. (단위는 seconds)

즉, 30초 이상 작업을 한다면 Fatal error 를 출력하면서 500 에러가 발생하는 셈입니다. 

 

그렇다면 해결 방법은 어떻게 될까요? 

앞서 전역적인 설정이 어려울 경우 ini_set 함수를 이용한다고 언급드렸습니다. 

이번에도 동일한 함수를 이용해 max_execution_time 설정을 변경할 것입니다. 

 

문제가 발생한 php 소스코드가 BB.php 라고 가정한다면 해당 파일의 맨위에 아래의 코드를 추가해줍니다. 

<?php

ini_set('max_execution_time', '300');

 

"최대 실행 시간(max execution time)을 300초(=5분)으로 하되 이를 BB.php 에 한해서만 설정" 이라는 의미가 되겠습니다. 

이 외에도 set_time_limit 함수를 이용할 수 있으며 효과는 동일합니다. 

<?php

set_time_limit(300);

 

여러분의 취향것 하면 좋습니다. 

저는 개인적으로 php.ini 파일의 설정이름과 동일한 ini_set 함수를 애용합니다. 

 

맺음말

Legacy PHP 언어는 유연하지만 정적인 타입을 제공하지 않으므로 워드프레스(Wordpress)와 같은 상용 CMS에서도 Warning, Notice 등의 에러가 자주 발생해 에러 알림을 기본적으로 Off 합니다. 

 

따라서, 에러가 발생하더라도 그 에러를 추적하기 힘든 속성을 가지게 되었습니다. 

 

이와 같은 한계로 인해 코드 관리 및 유지보수가 어려운 PHP 이지만 과거에는 대체제가 없을 정도로 각광을 받은 언어이기도 합니다. 

현재는 수많은 개발언어들의 범람으로 인기가 많이 퇴색한듯하나 계속해서 발전을 거듭하여 PHP@8.3 버전이 올해 출시되었습니다. 

 

https://www.php.net/releases/8.3/en.php

 

PHP: PHP 8.3.0 Release Announcement

PHP 8.3 is a major update of the PHP language. It contains many new features, such as explicit typing of class constants, deep-cloning of readonly properties and additions to the randomness functionality. As always it also includes performance improvements

www.php.net

 

앞으로 PHP 언어가 과거의 명성을 되찾을지는 지켜봐야겠지만 여전히 많이 사용되는 언어 중 하나 입니다.

TIOBE 인덱스에 따르면 24년도 2월 기준으로 10위권을 지키고 있습니다. 

 

다만 지표의 추이를 보면 완만한 하향세를 그리고 있습니다. 오른쪽 그림은 이번에 10위권 내로 진입한 Go 언어의 추이입니다. 

 

 

앞으로도 PHP 를 많이 애용해주시길 바랍니다. 

K-IN 올림. 

반응형