테스트 사이트 - 개발 중인 베타 버전입니다

session_destroy - 로그아웃시 에러가 발생합니다. 채택완료

유명우 7년 전 조회 3,159

Warning: session_destroy(): Session object destruction failed

 

항상 발생하는건 아니고 특정 경우에만 발생하는데요.

같은 동작을 해도 에러가 발생 할 때가 있고 아닐때가 있네요.

평소에는 잘 작동하구요. 발생한 후에 새로고침을 하면 또 정상적으로 작동이됩니다.

 

session_start는 common.php에서 하였습니다.

 

몇날몇일을 검색해보고 찾아봤는데 도저히 해결을 못하겠네요 ㅜㅜ

 

//common.php

</p>

<p>//==============================================================================

// SESSION 설정

//------------------------------------------------------------------------------

@ini_set("session.use_trans_sid", 0);    // PHPSESSID를 자동으로 넘기지 않음

@ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)</p>

<p>session_save_path(G5_SESSION_PATH);</p>

<p>if (isset($SESSION_CACHE_LIMITER))

    @session_cache_limiter($SESSION_CACHE_LIMITER);

else

    @session_cache_limiter("no-cache, must-revalidate");</p>

<p>ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분)

ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초)

ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오.

ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다.</p>

<p>session_set_cookie_params(0, '/');

ini_set("session.cookie_domain", G5_COOKIE_DOMAIN);</p>

<p>@session_start();</p>

<p>

 

//logout.php

</p>

<p>// 이호경님 제안 코드

    session_unset(); // 모든 세션변수를 언레지스터 시켜줌

    session_destroy(); // 세션해제함</p>

<p>    // 자동로그인 해제 --------------------------------

    set_cookie('ck_mb_id', '', 0);

    set_cookie('ck_auto', '', 0);

    // 자동로그인 해제 end --------------------------------</p>

<p>    if ($url) {

        if ( substr($url, 0, 2) == '//' )

            $url = 'http:' . $url;</p>

<p>        $p = @parse_url(urldecode($url));

        /*

            // OpenRediect 취약점관련, PHP 5.3 이하버전에서는 parse_url 버그가 있음 ( Safflower 님 제보 ) 아래 url 예제

            // <a href="http://localhost/bbs/logout.php?url=http://sir.kr%23@/" target="_blank" rel="noopener noreferrer">http://localhost/bbs/logout.php?url=http://sir.kr%23@/</a>

        */

        if (preg_match('/^https?:\/\//i', $url) || $p['scheme'] || $p['host']) {

            alert('url에 도메인을 지정할 수 없습니다.', G5_URL);

        }</p>

<p>        $link = $url;

    } else if ($bo_table) {

        $link = G5_BBS_URL.'/board.php?bo_table='.$bo_table;

    } else {

        $link = G5_URL;

    }</p>

<p>    goto_url($link);</p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

채택된 답변
+20 포인트
7년 전

logout.hphp에서 session_unset(); 또는 session_destroy(); 둘 중에 하나를 주석처리나 삭제하여 보세요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

유명우
7년 전
unset을 주석처리했을때는 세션이 유지돼서 로그아웃이 안되는 경우가 생겼었는데,
destroy를 주석처리하니 아직까지는 에러없이 잘 작동하는거 같네요.
두개를 같이 사용했을때 에러가 발생했던건 세션을 두번 초기화해서 그랬던걸까요..?

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인