2009-06-20 22 views
1

PHPでカスタムセッションを作成しようとしています。しかし、何らかの理由で、私のセッションの読み込みfunctonが呼び出されているだけで、私のセッションの書き込み関数ではありません。したがって、セッションは永続化されません。私がデフォルトのセッションハンドラ(ファイル)に戻ると、すべてが機能します。テストスクリプトの最後に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()への呼び出しが別のディレクトリに記録されました。

関連する問題