c ++: ошибка компиляции при использовании map в c ++ STL? [закрыто]

Если вы используете обработку сеанса по умолчанию PHP, единственный способ надежно изменить продолжительность сеанса на всех платформах - изменить php.ini . Это связано с тем, что на некоторых платформах сбор мусора реализуется через скрипт, который запускается каждое определенное время (скрипт cron ), который читается непосредственно из php.ini , и поэтому любые попытки изменение его во время выполнения, например через ini_set(), ненадежны и, скорее всего, не сработают.

Например, в системах Debian Linux сбор мусора производится через /etc/cron.d/php5, который выполняется в XX: 09 и XX: 39 (т. Е. Каждые полчаса), и если он найдет сеанс старше, чем session.gc_maxlifetime, указанный в php.ini , то этот сеанс удаляется без пощады. Это также объясняет, почему в этом вопросе: Сроки PHP слишком быстро выходят из строя , у ОП были проблемы на одном хосте, но проблемы прекратились при переключении на другой хост.

Итак, данный что у вас нет доступа к php.ini , если вы хотите сделать это переносимо, использование сеанса по умолчанию не является вариантом. По-видимому, продление срока действия файла cookie было достаточно для вашего хоста, но если вы хотите, чтобы решение было надежно, даже если вы переключаете хосты, вам нужно использовать другую альтернативу.

Доступные альтернативные методы включают в себя:

  1. Установите другой сеансовый (save) обработчик в PHP, чтобы сохранить ваши сеансы в другом каталоге или в базе данных, как указано в PHP: пользовательские обработчики сеансов (руководство по PHP) , так что задание cron не доходит до него, и только внутренняя сборка мусора PHP выполняется. Этот параметр, вероятно, может использовать ini_set() для установки session.gc_maxlifetime, но я предпочитаю просто игнорировать параметр maxlifetime в моем обратном вызове gc() и определять максимальный срок службы самостоятельно.
  2. Полностью забыть о внутренней обработке сессий PHP и реализовать собственное управление сеансом. Этот метод имеет два основных недостатка: вам понадобятся ваши собственные глобальные переменные сеанса, так что вы потеряете преимущество супер-локула $_SESSION, и ему нужен больше кода, поэтому есть больше возможностей для ошибок и недостатков безопасности. Самое главное, идентификатор сеанса должен быть сформирован из криптографически безопасных случайных или псевдослучайных чисел, чтобы избежать предсказуемости идентификатора сеанса (что приводит к возможному захвату сеанса), и это не так просто сделать с PHP портативно. Главное преимущество заключается в том, что он будет работать последовательно на всех платформах, и вы полностью контролируете код. Это подход, принятый, например, phpBB форум (по крайней мере, версия 1, я не уверен в более поздних версиях).

Пример (1) в для session_set_save_handler() . Пример длинный, но я воспроизведу его здесь, с соответствующими изменениями, необходимыми для продления продолжительности сеанса. Обратите внимание на включение session_set_cookie_params(), чтобы увеличить время жизни файла cookie.

savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
        $this->lifetime = 3600; // 1 hour minimum session duration
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        return true;
    }

    function close()
    {
        return true;
    }

    function read($id)
    {
        return (string)@file_get_contents("$this->savePath/sess_$id");
    }

    function write($id, $data)
    {
        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
    }

    function destroy($id)
    {
        $file = "$this->savePath/sess_$id";
        if (file_exists($file)) {
            unlink($file);
        }

        return true;
    }

    function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
                unlink($file);
            }
        }

        return true;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler(
    array($handler, 'open'),
    array($handler, 'close'),
    array($handler, 'read'),
    array($handler, 'write'),
    array($handler, 'destroy'),
    array($handler, 'gc')
    );

// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');

session_set_cookie_params(3600); // Set session cookie duration to 1 hour
session_start();
// proceed to set and retrieve values by key from $_SESSION

Подход (2) более сложный; в основном, вам необходимо повторно реализовать все функции сеанса самостоятельно. Я не буду вдаваться в подробности здесь.

-11
задан Jerry Coffin 22 January 2014 в 21:39
поделиться