안녕하세요
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 언어가 과거의 명성을 되찾을지는 지켜봐야겠지만 여전히 많이 사용되는 언어 중 하나 입니다.
TIOBE 인덱스에 따르면 24년도 2월 기준으로 10위권을 지키고 있습니다.
다만 지표의 추이를 보면 완만한 하향세를 그리고 있습니다. 오른쪽 그림은 이번에 10위권 내로 진입한 Go 언어의 추이입니다.
앞으로도 PHP 를 많이 애용해주시길 바랍니다.
K-IN 올림.
'프로그래밍' 카테고리의 다른 글
면접, REST API vs RESTful API 란 무엇? (92) | 2024.03.19 |
---|---|
코드 리뷰 주의사항, 선언(Declaration)과 정의(Definition)의 차이점 (78) | 2024.02.27 |
컴퓨터 과학, First Class Functions/Citizens/Objects 의 개념 (5) | 2024.02.15 |
리눅스, Inotify Error 해결 방법 (2) | 2024.02.01 |
[vscode] Visual Studio Code 확장 프로그램 추천 - MySQL (대부분 DB 연결이 한번에 가능) 데이터 베이스 매니저 확장 프로그램! (0) | 2023.03.03 |