[PHP] PHP Notice: Use of undefined constant ~ 해결하기

2017-05-04
웹 개발 이야기

작성일자: 2017-05-04 23:12:43
최종수정: 2017-05-05 00:23:04
Link: http://blog.jeehooo.net/9



  


잉여로운 삶을 보내고 있는 어느 날, 저한테 카톡 하나가 왔습니다.
서버 하드가 갑자기 꽉 차버렸고, 그 덕분에 서버가 죽어버렸다네요...
원인을 찾아보니 전체 용량 130기가 중에서 에러 로그가 92기가를 먹고 있었다고...
 

"뭐라고, 남은 공간이 없다고?
아닣니 그보다도, 조금 전에 뭐라고 했나, 하드가 꽉 찼다구?
에러 로그가 92기가가 됐다, 그런 말인가?
92기가라니! 아니, 로그가 92기가라니!
이게 무슨 소리야! 에잇 92기가라니!!
로, 로그가 92기가라니!!

앓흐 앓흐 아 앓…"

어떻게 텍스트가 저런 대용량을 먹을 수가 있지?
웬만한 대형 DBMS 에서도 50기가 넘는 DB는 아직까지 본 적이 없는데...

"설마 아닐꺼야..."라는 주문을 외우며 서버 상태를 보니...




네, 정말 92기가 입니다.
error.log 단일 파일 하나의 용량이 92기가......

당장 저 로그 때문에 하드가 꽉 차서 서비스가 중단된 상황이라
엑세스 로그 파일 자체를 삭제해서 다시 서비스가 돌아가게 해놓으셨다는데...
오늘 다시 들어가보니 5기가가 넘는 에러 로그가 또 쌓여있는겁니다.

아... 이건 문제가 있구나 싶어서 파일을 까보려고 했는데
용량이 너무 크다보니 메모장은 커녕 에디트플러스도 파일을 열지 못하더군요ㅜㅜ
어쩔 수 없이 에러로그를 카피해 와서 Ultraedit 을 사용해서 열어봤습니다.





눈치 빠르신 분은 벌써 아셨죠?
'PHP Notice: Use of undefined constant ~' 로 시작하는 로그가
1초에 2000건 이상 기록되고 있었습니다.
페이지 한 번 열릴 때 마다 2000줄의 로그가 쌓이는 상황이었죠. 

구글링을 통해 알아본 결과,
이 오류의 정체는 PHP가 업그레이드 되면서 새로 추가된 경고 메시지였습니다.
사실 오류도 아니었던거죠...
PHP 5.3.x 버전 이후부터는 변수에 따옴표가 없으면 경고 메시지를 에러 로그에 기록하도록
변경되었다고 하더라구요.

원래대로라면 $var['type'] 같이 변수 안에 따옴표를 써주는 것이 정석이지만,
 $var[type] 형식으로 써도 작동에는 지장이 없었기 때문에 따옴표를 빼먹고 코딩하는 일이 많았습니다.

문제는 5.3.x 버전 이후부터는 작동은 시키지만, 문법이 틀렸다고 에러 로그를 남기는 기능이 추가되었기 때문에
프로그램을 실행시킬 때 마다 따옴표 빠진 변수의 갯수만큼 경고 메시지가 발생하게 된다는 것!

아마 저 프로그램 개발자분께서 모든 변수를 따옴표 없이 코딩해놓으셨고,
어느 시점에(재부팅) 아파치가 최신 버전으로 업데이트 되면서 그 때부터 엄청난 양의 에러 로그가 쌓인 것이겠죠...







서론이 너무 길었죠?
해결 방법 알려드릴께요.


1. PHP 설치 디렉터리를 찾으세요. 

2. php.ini 파일을 에디터에 불러옵니다.

3. error_reporting 항목의 설정 값이 E_ALL 로 되어있을겁니다.
   그 값 옆에 ^E_NOTICE 를 추가하세요. (PHP Notice 로 시작하는 항목을 제외한 나머지 내용을 로그에 기록하게 됩니다.)
php.ini 파일에서

error_reporting = E_ALL
로 설정된 값을
error_reporting = E_ALL^E_NOTICE
와 같이 수정하세요


4. 웹 서버재시작해주세요. 
아파치(APM) 기반 서버일 경우 아파치만 재부팅시켜주시면 적용되지만.
Nginx 서버 처럼 PHP-fpm 이 별도로 돌 경우에는 PHP도 재시작해주셔야 합니다.






정상적으로 적용되었다면 error.log 에 PHP Notice로 시작하는 오류 메시지가 남지 않게 됩니다.
에러 로그 정리 후 몇 시간 지켜봐도 에러 로그가 늘지 않고 kb단위에서 놀고 있네요~