Вопрос

Я пытаюсь написать собственный сохранятель сеанса на PHP.Но по какой-то причине вызывается только моя функция чтения сеанса, а не моя функция записи сеанса.Таким образом, сеанс не сохраняется.Если я вернусь к обработчику сеанса (файлу) по умолчанию, все будет работать.Если я добавлю session_write_close() в конце тестового скрипта - все работает.Но в руководстве PHP прямо указано, что вам не нужно явно вызывать session_write_close() потому что он автоматически вызывается в конце скрипта.И я не хочу помещать session_write_close() в каждую возможную точку выхода в моем существующем приложении!

Вот код, иллюстрирующий проблему.Я запускаю его на 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();
?>
Это было полезно?

Решение

Бларх!Попался на заметку, которую туда поместил сам PHP!Цитирую инструкцию:

Предупреждение

Текущий рабочий каталог изменяется с некоторыми SAPI, если сеанс закрывается при завершении сценария.Можно закрыть сессию раньше с помощью session_write_close().

Ситуация действительно менялась, и призывы к s_write() и s_close() были авторизованы в другом каталоге!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top