cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 10 ноября 2022 в 14:04

InstantCMS 2.15.2

Вроде все настроено. Права на папку php_sess '777'. Сами файлы сессий создаются там с правами '600'

...Изображение
Изображение
Изображение
Изображение

Но старые файлы только умножаются. Сейчас 43 тысячи. Запуск задания вручную из планировщика все чистит.

Работу крона проверил так: в код cron.php вставил вывод названия задачи

  1. try {
  2. // Выполняем хук
  3. $controller->runHook("cron_{$task['hook']}");
  4. echo $task['hook'] . ' выполнен!';

и по инструкции хостера добавил вывод результатов запуска в файл.

/usr/local/bin/php7.4 -f ~/blago-mepar.ru/public_html/cron.php | tee ~/file.txt

В файлике периодически все отображается, в том числе нужное задание: sessionclean выполнен!run_queue выполнен!

Тему читал. Что еще надо, не хватает ума.

#2 10 ноября 2022 в 14:21

Посмотрите, что вам возвращает $controller->runHook()

  1. $res = $controller->runHook("cron_{$task['hook']}");
  2. var_dump($res);
  3.  


 

#3 10 ноября 2022 в 14:51

Посмотрите, что вам возвращает $controller->runHook()

IamB

bool(false)

Добавлено спустя 5 минут

Я вернул вывод названия хука и при следующем автостарте через крон.

bool(true)
sessionclean выполнен!bool(false)
run_queue выполнен!

#4 10 ноября 2022 в 15:05

bool(false)

bestit

Копайте глубже — смотрите какая ветка логики работает в runHook() 

#5 10 ноября 2022 в 15:12

Копайте глубже — смотрите какая ветка логики работает в runHook() 

IamB


Как же мне это дебажить?

У меня стандартная, в общем, установка. И такую проблему с автоудалением файлов сессий я имею на нескольких сайтах. Все они на shared хостинг Beget. Может, куда туда копать? Почему тогда ручной старт задачи отрабатывает? Он не использует runHook()?

#6 10 ноября 2022 в 15:29

Как же мне это дебажить?

bestit

Можете воспользоваться моим логгером или выводите свои сообщения в файл(file.txt)

#7 10 ноября 2022 в 16:55

Только сейчас заметил, что под спойлер убрал только первую картинку. Извиняюсь. Если кто-то имеет право, можете подредактировать. Я уже не могу.

#8 10 ноября 2022 в 19:49

 bestit, и очень странно, что нет никаких сообщений об ошибках. У вас отладка включена?

#9 10 ноября 2022 в 22:31

У вас отладка включена?

IamB

Была включена. 

Я дошел до controllers/users/hooks/cron_sessionclean.php Именно здесь отрабатывает очистка по расписанию.

Сделал здесь дебаг в файл. Количество элементов массива $files = glob($this->cms_config->session_save_path.'/ses*') равно 0

В $this->cms_config->session_save_path хранится tmp/php_sess

Соответственно, $files должен вот тут (картинка) получить массив имен файлов по шаблону tmp/php_sess/ses*

Изображение


Видимо, все дело в относительности пути. Сейчас папка сессий определена внутри сайта. Ручной запуск задания чистит эту папку, а в автомате используется функция glob();  И она показывает ноль файлов для чистки. Получается, она не видит эту папку с фалами сессий.

Если прописать путь вне сайта, как оно и было в исходной конфигурации Instant, поставив впереди слеш  /tmp/php_sess то сессии как бы попадать в некую общую папку /tmp хостера. Я туда вошел. Вообще непонятно, как файлы туда попадают и могут ли они тут удаляться? Вручную не дает, пишет нет доступа. Даты всех файлов 1970 год

Изображение


И дебаг переменной $files с такой настройкой пути снова показывает 0 файлов.

Уважаемый Loadырь, у вас есть возможность проверить на хостинге Beget, корректно ли отрабатывает автоматическая очистка устаревших файлов сессий?

#10 10 ноября 2022 в 22:54

 bestit, попробуйте запустить это.

#11 10 ноября 2022 в 23:30

Убедитесь, что в конфиге php cli в open_basedir указана директория сессий. Убедитесь, что пользователю, от которого запускается команда для CRON, директория сессий доступна для чтения списка файлов.

#12 11 ноября 2022 в 08:37

cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются

Запуск задания вручную из планировщика все чистит.

На мой взгляд, это явно указывает на то, что настроенный в задании cron /usr/local/bin/php7.4 и php, который работает на сайте — разные.

 bestit, зайдите в настройки — в колонке слева кнопка «Система» — нажмите и посмотрите, какая там указана версия php.

#13 11 ноября 2022 в 12:43

bestit, зайдите в настройки — в колонке слева кнопка «Система» — нажмите и посмотрите, какая там указана версия php.

Ris

Версия PHP: 7.4.25, apache2handler

Добавлено спустя 45 минут

Убедитесь, что в конфиге php cli в open_basedir указана директория сессий.

Fuze

open_basedir 'no value'

У меня shared хостинг и возможность управлять настройками php ограничена лишь некоторыми директивами .htaccess

Убедитесь, что пользователю, от которого запускается команда для CRON, директория сессий доступна для чтения списка файлов.

Fuze

От кого запускается крон, который я настраиваю в панели хостера — это как я могу посмотреть?

Команда top, запущенная по ssh мне показывают минимум — только саму запущенную мной команду top :)

Из-за общего хостинга все права на папки внутри домашней директории с моей учеткой у хостера:  bestit

Корень, доступный мне — это папка ~, которая указывает на домашнюю папку, созданную для моей учетки.

/home/b/bestit

Приведу скрин из phpinfo() — все настройки sessions (спойлер)

Там как раз указана общая для всех корневая /tmp/php_sess папка. Ее содержимое (скрин я приводил ранее) для моей учетки доступно только для чтения. Поэтому у меня и было желание организовать папку для сессий внутри домашней директории, чтобы контролировать ее.

Указание папки tmp/php_sess (без первого слеша) в настройках InstantCMS приводит к созданию папки в корне сайта. Файлы сессий там начинают появляться. Если запускать задание sessionclean вручную из планировщика Instant, то папка очищается как положено. И настроенный запуск cron.php через панель хостера тоже отрабатывает. При этом задание sessionclean тоже срабатывает. НО. Моя папка сессий уже не очищается от старых сессий.

Массив $files = glob($this->cms_config->session_save_path.'/ses*') пустой

...Изображение
Добавлено спустя 27 минут

Я нашел обходное решение. Указал в cron_sessionclean.php вместо использования переменной из конфига абсолютный путь до папки сессий.

//$files = glob($this->cms_config->session_save_path.'/ses*');
$files = glob('/home/b/bestit/bestit.beget.tech/public_html/tmp/php_sess/ses*');

И по отладочной информации я стал видеть количество файлов сессий в моей папке. (время сессий в конфиге сейчас 10 минут). 

11.11.2022 12:05:02 Maxlife: 600 Files count: 1
11.11.2022 12:15:01 Maxlife: 600 Files count: 2
11.11.2022 12:20:02 Maxlife: 600 Files count: 1

Вот теперь все работает ожидаемо. Вошел на сайт — файл сессий создался. Через 10 минут создался второй файл сессий. Из-за разницы времени запуска крона первый файл удалился чуть позже и меня выбросило на авторизацию. Как я понимаю в момент когда первый файл сессии удалился по расписанию. И после нового входа создался третий файл.

Добавлено спустя 17 минут

В общем, я открыл очередную Америку!

А если бы следовал подсказкам для поля, то можно было сразу догадаться, что такое полный путь для shared хостинг

Я вернул оригинальный cron_sessionclean.php и настройку. Все работает. Спасибо всем, кто откликнулся.

Изображение

#14 14 ноября 2022 в 16:59

вопрос закрыт

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.