Почему /usr/lib/php/sessionclean не очищает устаревшие сессии?

Здравствуйте.
Берём ubuntu 18.04 и устанавливаем php/php-fpm. И на удивление можно заметить что задание из крона не удаляет устаревшие сесии в каталоге /var/lib/php/sessions

в php.ini
session.save_path="/var/lib/php/sessions"
В syslog
Dec 14 20:09:01 srv CRON[12814]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
Dec 14 20:09:03 srv systemd[1]: Starting Clean php session files...
Dec 14 20:09:03 srv sessionclean[12815]: /usr/lib/php/sessionclean: 38: /usr/lib/php/sessionclean: arithmetic expression: expecting primary: "/60"
Dec 14 20:09:03 srv systemd[1]: Started Clean php session files.


файл /etc/cron.d/php
09,39 *     * * *     root   [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi


Файл /usr/lib/php/sessionclean
#!/bin/sh -e
#
# sessionclean - a script to cleanup stale PHP sessions
#
# Copyright 2013-2015 Ondřej Surý <ondrej@sury.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

SAPIS="apache2:apache2 apache2filter:apache2 cgi:php@VERSION@ fpm:php-fpm@VERSION@ cli:php@VERSION@"

# Iterate through all web SAPIs
(
proc_names=""
for version in $(/usr/sbin/phpquery -V); do
    for sapi in ${SAPIS}; do
        conf_dir=${sapi%%:*}
        proc_name=${sapi##*:}
        if [ -e /etc/php/${version}/${conf_dir}/php.ini ]; then
            # Get all session variables once so we don't need to start PHP to get each config option
            session_config=$(PHP_INI_SCAN_DIR=/etc/php/${version}/${conf_dir}/conf.d/ php${version} -c /etc/php/${version}/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
            save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p')
            save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*;\)\?\(.*\)$/\2/p')
            gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60))

            if [ "$save_handler" = "files" -a -d "$save_path" ]; then
                proc_names="$proc_names $(echo "$proc_name" | sed -e "s,@VERSION@,$version,")";
                printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
            fi
        fi
    done
done
# first find all open session files and touch them (hope it's not massive amount of files)
for pid in $(pidof $proc_names); do
    find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_*" -exec touch -c {} \; 2>/dev/null
done ) | \
    sort -rn -t: -k2,2 | \
    sort -u -t: -k 1,1 | \
    while IFS=: read -r save_path gc_maxlifetime; do
        # find all files older then maxlifetime and delete them
        find -O3 "$save_path/" -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin "+$gc_maxlifetime" -delete
    done

exit 0


Почему стандартный комплект из коробки не чистит сессии? Надо что то дополнительно донастроить?
Спасибо.
  • Вопрос задан
  • 2074 просмотра
Решения вопроса 1
@vebmaster Автор вопроса
Причиной проблемы было наличие функции ini_get_all в disable_functions.
Убрал её и всё заработало как надо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
find /var/lib/php/sessions/sess_* -mmin +240 -delete;

ну так чистите нужную директорию в лоб ;)
например таким таском раз в час. что старее min +240 (240 минут = 4 часа)
Ответ написан
@galaxy
Что-то не то с настройкой session.gc_maxlifetime, похоже.

Сделайте для каждого конфига PHP:
php -c /etc/php/VERSION/CONFD/php.ini -d "error_reporting='~E_ALL'" -r 'var_dump(ini_get_all("session"));'

где VERSION - версия, CONFD - директории с конфигами в /etc/php/VERSION (т.е. cli, fpm, apache2...).
И проверьте, что в session.gc_maxlifetime
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы