Проблемы с тайм-аутом Auth с CakePHP

Меня это действительно беспокоит. Был в течение многих лет. Независимо от того, что я делаю с 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.

Вещи, которые вы должны проверить / сделать, чтобы исправить проблему:

  1. Укажите выделенный путь для хранения сеансов в session.save_path если вы этого еще не сделали. Не храните их в / tmp – может возникнуть какой-то другой процесс и уничтожить их для вас.

  2. Убедитесь, что значение session.gc_maxlifetime – это то, что вы думаете (86400, если вы хотите, чтобы ваши логины таймизировали после 24 часов бездействия и т. Д.). То же самое с session.gc_divisor и session.gc_probability . Несмотря на то, что в руководстве PHP указано, что настройки сеанса могут быть установлены на любом уровне, в зависимости от уродства вашей PHP-сборки (все они слегка искажены тонкими способами :)), вы можете обнаружить, что они фактически не вступают в силу, если не установлены в глобальном файле php.ini, в отличие от кода, .htaccess и т. д. Просто выведите их в своем фактическом приложении, чтобы убедиться, что они применяются.

  3. Кроме того, в зависимости от вашей среды, проверьте, использует ли сборка CLI PHP тот же файл php.ini, что и сборка PHP по умолчанию – если сборка CLI использует другой файл конфигурации, и у вас есть задания cron с использованием сборки CLI, сценарии работы cron может вызвать процедуру очистки сеанса.

Если у вас много приложений CakePHP на одном сервере, это может быть причиной ваших проблем. Не забудьте:

  1. Префикс для каждого приложения по-разному (префикс $ on core.php).
  2. Измените имя каждого пути к файлу cookie:

     Configure::write('Session', array( 'defaults' => 'php', 'timeout' => 4320, 'ini' => array( 'session.cookie_path' => '/name_app', // this for each app )));