php вручную session.gc_maxlifetime под Linux (Debian, Ubuntu) игнорируется. Как установить альтернативу? - PullRequest
2 голосов
/ 15 ноября 2011

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

Поскольку я не хочу менять настройки по умолчаниюна моем сервере и хочу остаться максимально независимым с моим сценарием. Я ищу способ превысить стандартные 1440 секунд, которые установлены для сборщика мусора для преждевременной утилизации моих данных сеанса.Простая установка ini_set('session.gc_maxlifetime',36000); на 10 часов не сработает, так как на некоторых серверах GC будет работать независимо от настроек php и в любом случае удалит мои сеансы через 24 минуты, как описано здесь .Чтобы обойти эту проблему, автор предлагает изменить session.save_path на другую папку, не зависящую от gc операционной системы, и тем самым принудительно установить set session.gc_maxlifetime в мои настройки.К сожалению, я не смог создать временную папку в tmp-пространстве php, и, хотя мне это нравится, я не могу этого сделать, поскольку у меня нет доступа к 0600 на большинстве серверов.

Одним из решений было бысвяжите мои данные сеанса с моей собственной папкой, созданной прямо в моей общей папке хоста, но это кажется небезопасным, так как эта папка должна быть доступна онлайн и, следовательно, подвергаться возможной краже идентификатора.Хотя я не знаю, так ли это.

Другое решение будет включать $_SESSION["stayalaive"]=time();, так как gc удаляет только те сеансы, которые не были затронуты, в течение определенного времени в сценарии входа в систему, чтобы сеанс был расширен.хотя каждый раз, когда вызывается сценарий входа, это означает, что если пользователь ничего не нажимает в течение 24 минут, сеанс будет удален в любом случае, и это то, с чем я мог бы жить, но он также вызывает другой процесс, который кажется ненужным.1012 * Таким образом, мой вопрос заключается в том, как настроить данные сеанса так, чтобы они оставались в живых в течение 10 часов без увеличения производительности.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Ранее я использовал директивы php.ini внутри скриптов, и кроме того, вы можете создавать каталоги в зарезервированном пространстве вашего хостинга.

Так что (в самом начале вашего скрипта) это должно работать, без сомнения:

<?php

    // obtain current directory
    $APPPATH = dirname(__FILE__); 

    if ( ! file_exists($APPPATH . '/tmp/sessions'))
    {
        mkdir($APPPATH . '/tmp/sessions', 0700, TRUE);
    }

    ini_set('session.save_path', $APPPATH . '/tmp/sessions');
    ini_set('session.gc_maxlifetime', 36000);
    session_start();

?>

Обе директивы имеют PHP_INI_ALL изменяемый режим , поэтому могут быть установлены внутри скриптов.

0 голосов
/ 16 ноября 2011

Любой веб-хостинг, достойный их внимания, предоставит вам каталог над вашей папкой public_html (или любой другой). Если у вас есть, то вы можете создать каталог для сессий там, и он не будет доступен из Интернета.

Если ваш хостинг настолько дрянной, что все, к чему вы можете прикасаться через FTP / SSH / что-либо, что также доступно через HTTP, все более раздражает.

Итак, если у вас дерьмовый хост, вот несколько идей:

1) Сохраняйте сеансы внутри своего веб-корня и используйте .htaccess, чтобы сделать его недоступным для просмотра.

2) Сохранить данные сеанса в базе данных.

Любая из этих опций должна позволять вам устанавливать собственные правила сборки мусора с помощью ini-set () и избегать того, чтобы другие процессы засоряли ваши сессии.

...