2009-06-20 1 views
1

PHP에서 사용자 정의 세션을 작성하려고합니다. 하지만 몇 가지 이유만으로도 내 세션 읽기 기능이 아니라 펑크 턴이 호출되고 있습니다. 따라서 세션은 지속되지 않습니다. 다시 기본 세션 처리기 (파일)로 전환하면 모든 것이 작동합니다. 테스트 스크립트의 끝에 session_write_close()을 추가하면 모든 것이 작동합니다. 그러나 PHP 매뉴얼에서는 명시 적으로 session_write_close()을 호출 할 필요가 없다고 명시하고 있습니다. 왜냐하면 스크립트 맨 마지막에 자동으로 호출되기 때문입니다. 그리고 기존 응용 프로그램의 가능한 모든 종료 점에 session_write_close()를 넣고 싶지 않습니다!PHP에서 session_set_save_handler()의 이상한 문제

다음은 문제를 설명하는 코드입니다. WinXP SP3 + Apache 2.2.9 + PHP 5.2.6에서 실행하고 있습니다. 로그 파일에는 s_open()s_read()에 대한 항목 만 포함됩니다.

<?php 
function logger($str) 
{ 
    file_put_contents('session_log.txt', date('Y-m-d h:i:s') . " $str\r\n", FILE_APPEND); 
} 

function s_open() 
{ 
    logger('s_open'); 
    return true; 
} 

function s_close() 
{ 
    logger('s_close'); 
    return true; 
} 

function s_read() 
{ 
    logger('s_read'); 
    return @file_get_contents('session.txt'); 
} 
function s_write($id, $data) 
{ 
    logger("s_write: $id - $data"); 
    file_put_contents('session.txt', $data); 
    return true; 
} 

function s_destroy() 
{ 
    logger('s_destroy'); 
    return true; 
} 

function s_gc() 
{ 
    logger('s_gc'); 
    return true; 
} 

session_set_save_handler('s_open', 's_close', 's_read', 's_write', 's_destroy', 's_gc'); 

session_start(); 

if (isset($_SESSION['time'])) 
    echo 'Session time: ' . date('Y-m-d h:i:s', $_SESSION['time']); 
else 
    echo 'Session empty'; 
echo '<br>';  
echo 'Session ID: ' . session_id(); 


$_SESSION['time'] = time(); 
?> 

답변

1

Blargh! PHP 자체가 거기에 두었다는 통지에 잡혔습니다! 스크립트 종료시에 세션이 닫혀있는 경우

현재 작업 디렉토리가 일부 SAPI에서로 변경

경고 : 설명서를 인용합니다. 세션을 이전에 session_write_close()으로 닫는 것이 가능합니다.

실제로 변경 중이므로 s_write()s_close()에 대한 전화가 다른 디렉토리에 기록되었습니다!