Системы на основе Debian Сессия завершается через 30 минут в специальном cron, как переопределить?

Я рвал на себе волосы, пытаясь выяснить, почему мои сеансы прекращаются/убиваются/уничтожаются через 30 минут. Что ж, похоже, что в системах на основе Debian работает специальный cron, который игнорирует все конфигурации php.ini и apache и убивает любой сеанс бездействия через 30 минут.

Cron-путь: /etc/cron.d/php5

Внутри крона:

# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm

Я неплохо разбираюсь в конфигурации и настройке хостов, но я не системный администратор. Может ли кто-нибудь помочь мне переопределить/отредактировать/изменить/перенастроить это, чтобы я мог установить значение дольше? Я думаю, что 3 часа было бы неплохо, но я хотел бы понять изменения, поэтому, если кто-то выше хочет сделать время сеанса короче/длиннее, я подпишу, как настроить изменение.

Благодаря любой помощи в этом

РЕДАКТИРОВАТЬ: Добавление кода /usr/lib/php5/maxlifetime

#!/bin/sh -e

max=1440

for ini in /etc/php5/*/php.ini; do
        cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
        [ -z "$cur" ] && cur=0
        [ "$cur" -gt "$max" ] && max=$cur
done

echo $(($max/60))

exit 0

поэтому он ищет все файлы php.ini, находит наибольшее значение, сравнивает его с 1440 (что составляет 24 минуты).

Вот файлы php.ini

/etc/php5/apache2/php.ini
session.gc_maxlifetime = 1440 

/etc/php5/cgi/php.ini
session.gc_maxlifetime = 1440

/etc/php5/cli/php.ini
session.gc_maxlifetime = 1440

но почему мой сеанс сценария завершается через 30 минут, а не через 24 минуты?

РЕДАКТИРОВАТЬ № 2: CRON работает каждые 30 минут, поэтому сеанс выглядит убитым с 30-минутными интервалами. Но это также может быть от 24 до 54 минут, к вашему сведению.

Также просматривая код в: /usr/lib/php5/maxlifetime он принимает самое высокое значение, и во время моего тестирования я пытался снизить порог, чтобы ускорить условие.

Похоже, мне просто нужно увеличить один в файлах php.ini до более чем одного часа тестового теста.


person Phill Pafford    schedule 05.10.2010    source источник


Ответы (6)


Отредактируйте файл /usr/lib/php5/maxlifetime

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

person Emil Vikström    schedule 05.10.2010
comment
Я тоже так думал, но этот файл ищет файлы php.ini (все они) и находит наибольшее значение в секундах (что составляет 1440 или 24 минуты). Но мой сеанс не истекает до 30 минут, и я не могу понять, почему - person Phill Pafford; 05.10.2010
comment
Задание cron запускается только каждые 30 минут, поэтому на самом деле ваш сеанс может длиться от 24 до 54 минут. - person al.; 05.10.2010
comment
дерьмо, только что был DUH момент. Спасибо, я думаю, это поможет мне в настройке более длинной сессии. - person Phill Pafford; 05.10.2010
comment
У меня тоже такая проблема. Как я могу отредактировать /usr/lib/php5/maxlifetime с помощью шпатлевки? Я действительно новичок в этом, поэтому, если вы поможете мне с некоторыми командами, это будет очень полезно. - person Daniel Soublett; 02.05.2016

Это вопрос для serverfault.com.

Однако измените session.gc_maxlifetime в /etc/php5/apache2/php.ini или, если у вас нет файла apache2, в одном из других /etc/php5/*/php.ini файлов. Затем сценарий /usr/lib/php5/maxlifetime будет использовать максимальное значение для этого параметра, найденное в любом из этих файлов.

Редактирование maxlifetime не поможет или, по крайней мере, только до тех пор, пока пакет php5-common не будет снова обновлен.

person al.    schedule 05.10.2010
comment
понятно насчет serverfault.com, но я также думаю, что это актуально, потому что я установил файл php.ini, а также попытался установить значение в самом php, и он все равно убивает сеанс через 30 минут, даже когда все настроено на 1440 секунд или 24 минуты - person Phill Pafford; 05.10.2010

Вы можете указать свой собственный путь сеанса session.save_path ИЛИ вообще использовать другой обработчик session.save_handler

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

Нашел это в моем php.ini

; NOTE: If you are using the subdirectory option for storing session files
;       (see session.save_path above), then garbage collection does *not*
;       happen automatically.  You will need to do your own garbage
;       collection through a shell script, cron entry, or some other method.
;       For example, the following script would is the equivalent of
;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
;          cd /path/to/sessions; find -cmin +24 | xargs rm

Недавно я столкнулся с этой проблемой, когда накапливались нежелательные файлы сеансов, потому что я использовал PHP и mod_fcgid с пользовательским session.save_path для каждого виртуального хоста.

person Khawar    schedule 13.11.2012

Если вы пришли сюда, потому что ваш cron выдает ошибки каждые 30 минут (в 09 и 39), у вас могут быть похожие ошибки в системном журнале и/или почтовом ящике:

[ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
PHP Fatal error: Directive 'allow_call_time_pass_reference' is no longer available in PHP in Unknown on line 0

Причиной этого может быть то, что вы upgraded your Debian to Wheezy и у вас есть старые записи в вашем /etc/php5/apache2/php.ini.

Мне пришлось закомментировать следующие строки, и ошибки исчезли.

  • allow_call_time_pass_reference
  • register_long_arrays

Я пишу это, потому что это один из лучших результатов Google, если вы ищете сообщения об ошибках, и это может повлиять на многих пользователей / администраторов, которые поддерживали свои установки debian для более чем одного выпуска.

PS: Это мне очень помогло: http://vernontbludgeon.com/blog/archives/2013/10/debian-php-session-garbage-collection-maxlifetime-fails-when-php.ini-has-obsolete-directives.html

person Martin Seitl    schedule 08.10.2014

Это прямо в вашем фрагменте cronjob php5:

Ищите и удаляйте старые сеансы каждые 30 минут.

Не имеет значения, что скрипт очищает 24-минутные сеансы, если скрипт не выполняется чаще, чем каждые 30 минут :)

person Brunis    schedule 25.10.2012

Используйте cron ниже, чтобы удалить неиспользуемые сеансы.

39 20     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
person MaheshPatade    schedule 07.08.2015