PHP

PHP 세션(Session)을 사용할 수 없는 경우 (세션 생성 문제)

bang2001 2013. 10. 17. 11:44

PHP에서는 세션(Session)을 프로그래머가 쉽게 사용할 수 있도록 관련함수를 제공합니다. 보통 아래와 같은 방법으로 세션을 다루게 됩니다.


[세션 사용의 예]


---------- 로그인 처리 페이지 등에서... ----------

session_start();

$_SESSION["USER_NAME"] = "홍길동";


---------- 그 밖의 페이지 등에서... ----------

<? session_start(); ?>

<?=$_SESSION["USER_NAME"]?>님의 접속을 환영합니다.


위와 같이 세션을 사용하게 됩니다. 그런데 위의 소스코드가 정상적으로 실행되지 않는 경우가 발생합니다. 그 경우의 수는 여러 가지가 있을 수 있겠는데요, 여기서는 서버용량과 관계지어 간략히 설명하겠습니다.


phpinfo() 함수를 사용하여 PHP 서버의 설정을 보시면,


session

Session Supportenabled
Registered save handlersfiles user sqlite
Registered serializer handlersphp php_binary


DirectiveLocal ValueMaster Value
session.auto_startOffOff
session.bug_compat_42OffOff
session.bug_compat_warnOnOn
session.cache_expire180180
session.cache_limiternocachenocache
session.cookie_domainno valueno value
session.cookie_lifetime00
session.cookie_path//
session.cookie_secureOffOff
session.entropy_fileno valueno value
session.entropy_length00
session.gc_divisor10001000
session.gc_maxlifetime14401440
session.gc_probability11
session.hash_bits_per_character55
session.hash_function00
session.namePHPSESSIDPHPSESSID
session.referer_checkno valueno value
session.save_handlerfilesfiles
session.save_pathno valueno value
session.serialize_handlerphpphp
session.use_cookiesOnOn
session.use_only_cookiesOffOff
session.use_trans_sid00



위와 같은 화면을 보실 수 있습니다. 그런데, 위 항목에서 session.save_path 이란 항목이 있습니다. 이 항목은 PHP에서 세션을 생성할 때 서버의 세션정보를 파일에 저장하게 되는데, 그 파일의 경로가 바로 session.save_path 항목 입니다.


보통은 위와 같이 session.save_path 항목이 no value로 설정되어 있을 것입니다. no value는 특별히 session.save_path 항목을 설정하지 않은 것으로 no value는 /tmp로 적용되도록 되어있습니다.


즉 session.save_path 항목을 설정하지 않으면 세션파일이 위치할 경로가 /tmp로 설정이 되는 것입니다.


그런데, 이 디렉토리에 해당하는 파티션의 용량이 꽉 찰 경우 문제가 발생합니다. 바로 세션을 더 이상 사용할 수 없다는 것이 바로 그것입니다. 그런데, 대부분 PHP 서버설정을 에러가 출력되지 않도록 설정하기 때문에 원인을 초기에 쉽게 파악하기 힘든면이 있습니다. 이로 인해서 저도 찾는데 시간이 걸렸구요.. 


따라서 아래와 같은 소스코드를 로그인 처리하는 페이지와 같은 곳에 넣어주시면 에러 메시지를 확인하실 수 있습니다.



[에러메시지 출력하기] -  참고) http://blog.daum.net/bang2001/72

error_reporting(E_ALL); 

ini_set("display_errors", 1);



위 소스코드를 삽입하였을 때 아래와 같은 메시지가 발생한다면 그것은 서버용량 문제입니다.


[세션 사용시 서버용량 Full로 인한 에러메시지]


Warning: Unknown: write failed: No space left on device (28) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0



메시지는 서버환경마다 약간 씩 달라질 수 있겠지만 대체로 위와 비슷할 것입니다. 위 메시지가 출력된다면 세션 디렉토리가 포함된 파티션의 용량을 확인해보시고 세션디렉토리 내 파일을 정리한다던가 하는 식으로 용량을 확보해보시기 바랍니다.