PHP 세션응용 코딩 시 session_start() [function.session-start]: Cannot send session cache limiter – headers already sent 에러의 원인

PHP의 session 변수를 이용해 사용자 로그인 여부를 검사하는 코딩을 할 때 이따금씩 특정 웹페이지에서 “session_start() [function.session-start]: Cannot send session cache limiter – headers already sent ~~~” 라는 오류를 보게 된다.

처음엔 도대체 이게 무슨 원인으로 발생하는 것인지 몰라 헤매곤 했다.그리고 오늘.. 또 뭔가 새로운 기능을 구현하다가 이 에러를 맞닥뜨렸다.

PHP와 MySql이 각각 euc-kr로 설정된 상태에서 php 소스파일을 UTF-8로 저장하게 되면 바로 이 에러가 발생한다. 당연히 php는 4.x 버전, MySql도 4.x 버전이다. 하지만 반대로 PHP와 MySql이 모두 UTF-8이 지원되는 경우에도 동일하게 발생하는 것 같다. 즉.. APM의 버전과는 별 관계가 없다는 것이다.

이 에러는 많은 PHP 초심자들을 힘들게 하는 것 같다. 수많은 개발자들이 질문을 하고 답변을 하는데… 대부분은 session_start(); 함수 앞에 그 어떤 코드도 포함되어 있으면 안된다는 답변이 가장 많다. (당연히 include(), require()의 앞이다.) 이것도 정답이다. 하지만 가장 앞에 포함되어 있는데도 발생한다면..???

여기서부터 참 막막해진다. session_start();앞에 @를 붙여 @session_start(); 와 같이 사용하면 된다고 하기도 하는데 이렇게 하면 속도가 느려진다는 무시할 수 없는 답변이 또 보인다.

결국 Goole을 뒤질 수 밖에 없었다. 그리고 찾아낸 원인은 APM의 Apache와 PHP의 버전 그리고 php 소스 파일이 저장될 때의 문자셋 때문에 발생한다는 것이다.

그 이유는 바로 아래화면 처럼 PHP 파일의 소스를 저장할 때 파일포맷을 무엇으로 하느냐에 따라 각각 파일 헤더의 내용이 다르고 그 헤더의 차이로 인해 Apache가 session_start() 함수의 앞부분에 무엇이 있는가 없는가를 판단할 때 오류의 원인을 제공하게 되기 때문이다. 특히 UTF-8 포맷으로 저장할 때 BOM 없음 옵션을 선택하고 저장해야한다는..정말로 어이없는 정답이었다.

울트라에딧에서 확인한 UTF-8 (BOM 아님) 저장옵션

PHP 버전이 낮은 경우에, 즉 PHP와 MySql이 모두 euc-kr인 경우는 ANSI 포맷으로 저장하면 session_start() 에러가 사라졌고 PHP5, Mysql이 모두 UTF-8인 경우에는 UTF-8 BOM 아님 옵션으로 지정하여 저장해야 session_start() 오류가 사라졌다.
이 문제로 골치아픈 초보 PHP 개발자들에게 도움이 되면 좋겠다.
영원한 초보인 난… 하루를 꼬박 헤맸다.. ^^

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top