Меня это действительно беспокоит. Был в течение многих лет. Независимо от того, что я делаю с core.php или php.ini, время ожидания входа в систему примерно через час – обычно. Некоторые развертывания идентичного кода и таймаута конфигурации после приличного количества времени.
Это то, что у меня есть на данный момент на одном сайте – время ожидания примерно через час:
session.gc_divisor 1000 session.gc_maxlifetime 86400 session.gc_probability 1 Configure::write('Session.timeout', '28800'); Configure::write('Session.checkAgent', false); Configure::write('Security.level', 'medium');
А другой – продолжался всю ночь:
session.gc_divisor 100 session.gc_maxlifetime 14400 session.gc_probability 0 Configure::write('Session.timeout', '315360000'); Configure::write('Session.checkAgent', false); Configure::write('Security.level', 'medium');
Теперь, прежде чем вы будете взволнованы и скажите: «Ну, ответ есть в значении Session.timeout», позвольте мне сказать вам, что этот сайт обычно истекает через двадцать минут!
Где-то я читал, что на общем хостинге другие приложения могут сбросить сеанс, очистив php-определенный каталог сеанса. Это был намек Роульфа в его ответе.
CakePHP предлагает возможность настроить способ обработки сеансов. В core.php
я изменил это на 'cake'
(по умолчанию это 'php'
):
/** * The preferred session handling method. Valid values: * * 'php' Uses settings defined in your php.ini. * 'cake' Saves session files in CakePHP's /tmp directory. * 'database' Uses CakePHP's database sessions. */ Configure::write('Session.save', 'cake');
Я также обеспечил, чтобы тайм-аут сеанса и соответствующие значения php.ini были одинаковыми:
/** * Session time out time (in seconds). * Actual value depends on 'Security.level' setting. */ Configure::write('Session.timeout', '86400');
Пока система не вышла из системы.
Я не думаю, что это специфическая вещь для пирога; Я видел это, когда не было никаких фреймворков – это, скорее всего, проблема с настройками конфигурации PHP.
Вещи, которые вы должны проверить / сделать, чтобы исправить проблему:
Укажите выделенный путь для хранения сеансов в session.save_path
если вы этого еще не сделали. Не храните их в / tmp – может возникнуть какой-то другой процесс и уничтожить их для вас.
Убедитесь, что значение session.gc_maxlifetime
– это то, что вы думаете (86400, если вы хотите, чтобы ваши логины таймизировали после 24 часов бездействия и т. Д.). То же самое с session.gc_divisor
и session.gc_probability
. Несмотря на то, что в руководстве PHP указано, что настройки сеанса могут быть установлены на любом уровне, в зависимости от уродства вашей PHP-сборки (все они слегка искажены тонкими способами :)), вы можете обнаружить, что они фактически не вступают в силу, если не установлены в глобальном файле php.ini, в отличие от кода, .htaccess и т. д. Просто выведите их в своем фактическом приложении, чтобы убедиться, что они применяются.
Кроме того, в зависимости от вашей среды, проверьте, использует ли сборка CLI PHP тот же файл php.ini, что и сборка PHP по умолчанию – если сборка CLI использует другой файл конфигурации, и у вас есть задания cron с использованием сборки CLI, сценарии работы cron может вызвать процедуру очистки сеанса.
Если у вас много приложений CakePHP на одном сервере, это может быть причиной ваших проблем. Не забудьте:
Измените имя каждого пути к файлу cookie:
Configure::write('Session', array( 'defaults' => 'php', 'timeout' => 4320, 'ini' => array( 'session.cookie_path' => '/name_app', // this for each app )));