bestit

bestit

+12
Репутация
11
Рейтинг
#1 [ЕСТЬ РЕШЕНИЕ] на хостинге поменял папку сайта и теперь сайт не работает с ошибкой 500 26 декабря 2022 в 08:05

А что с правами на доступ к файлам и папкам?

Loadырь

Права на папки и файлы внутри public_html были корректными. Я обычно использую скрипт из документации

Сегодня утром все уже работает. Провайдер переопределил права. Они просто сбросили вообще все файлы и папки на '700'. Я скриптом внутри сайта  еще раз прогнал для установки нужных прав. А то в mc все файлы были одного цвета. Неудобно :) Спасибо, тему закрываю.

#2 [ЕСТЬ РЕШЕНИЕ] на хостинге поменял папку сайта и теперь сайт не работает с ошибкой 500 25 декабря 2022 в 23:24

Beget. шаред. php 7.4.33

Удивительно, что все работало! Я на том же хостинге, что и был три часа назад. Просто перенес сайт из одной папки в другую. Настройки не менялись кроме перелинковки домена из-за смены папки.

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

 Ris, личным сообщением кинул ссылку на phpinfo

#3 [ЕСТЬ РЕШЕНИЕ] на хостинге поменял папку сайта и теперь сайт не работает с ошибкой 500 25 декабря 2022 в 22:55

Благодарю за помощь. root прописан как '/'

попробовал вписать здесь абсолютный новый путь '/home/b/bestit/blago-mosmit.ru/public_html/' — не помогло.

в остальных строках настроек написан домен сайта. Новый домен. Он как бы так и остался. Чую, что какая-то фигня на стороне хостера, но техподдержка пока не знает, взяли паузу в раздумьях.

'root'                                                          => '/',
'host'                                                          => 'https://blago-mosmit.ru',
'upload_root'                                           => '/upload/',
'upload_host'                                           => 'https://blago-mosmit.ru/upload',
'cache_root'                                            => '/cache/',

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

Более того, я убрал конфиг файл и вообще ничего не изменилось. Ошибка 500 выдается моментально. Такое впечатление что до чтения конфига дело не доходит

#1 [ЕСТЬ РЕШЕНИЕ] на хостинге поменял папку сайта и теперь сайт не работает с ошибкой 500 25 декабря 2022 в 21:56

Добрый вечер. Хостеру я сообщил, но они не могут понять. Делал простую вещь. Просто была ситуация, что папка, где лежал сайт была названа именем старого домена, которую просто так не переименовать. В панели хостера я отлинковал новый домен от старой папки, создан новый сайт с именем нового домена, у хостера автоматом создалась папка с новым именем. Я туда перекинул файлы сайта из старой папки. И прилинковал довый домен к новой папке. В конфиге InstantCMS вручную поправил 'session_save_path' В итоге сайт не работает. 500 и все...

Я включил лог у хостера и наблюдаю

PHP Fatal error:  require_once(): Failed opening required '/home/b/bestit/blago-mosmit.ru/public_html/system/config/autoload.php' (include_path='.:/usr/share/php') in /home/b/bestit/blago-mosmit.ru/public_html/bootstrap.php on line 25

В этой строке идет подключение:

require_once PATH. '/system/config/autoload.php

'PATH' определяется в начале bootstrap.php, я проверил var_dump(PATH) он соответствует новой папке  

Может быть еще важно, для нового домена включен сертификат https Let's. Что-то можете посоветовать?

#5 [ЕСТЬ РЕШЕНИЕ] Как программно получить значения полей и свойств связанного контента? 25 декабря 2022 в 19:04

Чтобы посмотреть как работать с сессиями на небольшом примере можно посмотреть этот пост и код к нему. 

IamB

Спасибо! Получилось разобраться с сессиями. Все просто, т.к. я дорабатывал внутри функционала механизм сессий уже работает.

В нужном месте с помощью cmsUser::sessionSet('my_sess_var', $my_var) записываю данные в сессию, в другом месте с помощью cmsUser::sessionGet('my_sess_var') значение получаю. И затем обнуляю cmsUser::sessionUnset('my_sess_var');

Тему закрываю

#6 [ЕСТЬ РЕШЕНИЕ] Как программно получить значения полей и свойств связанного контента? 30 ноября 2022 в 14:54

В сессию пишите, это стандартный механизм.

IamB

Спасибо за совет! Вообще пока не работал программно с этим механизмом. Посмотрел документацию. Это не маленькая тема.

Подскажите еще, правильно ли я понимаю, что при авторизации и работе с сайтом на InstantCMS сессии создаются автоматом, и мне можно будет только воспользоваться своей переменной вида: $_SESSION['my_var'] = 'xx' или я ошибаюсь, и мне придется использовать весь механизм начиная от инициализации своей session_start();  и так далее по php документации?

#7 [ЕСТЬ РЕШЕНИЕ] Как программно получить значения полей и свойств связанного контента? 29 ноября 2022 в 16:43

Попробуйте так

My-InstantCMS.Ru

Спасибо! Почти получилось...

Не могу решить проблемку с тем, что у меня в создаваемом контенте есть связь сразу с двумя другими контентами. И получается, я получаю поля и свойства то одного, то другого, а получить сразу данные от обоих не могу.

Поясню, что я пытаюсь в system/controllers/content/actions/item_add.php сделать так, чтобы для определенного создаваемого контента автоматически формировалось его поле заголовок (title). Форма заполняется пользователем, связи им выбираются и после нажатия сохранить должен формируется заголовок новой записи.

Предложенную Вами функцию я оформил в model.php как GetParentContentProps($parent_id, $parent['ctype_name'])

Она прекрасно все вытаскивает, но похоже код функции run() в item_add.php вызывается дважды (в зависимости от количества связей)  и я теряю значения первой переменной при втором проходе.

Код под спойлером. Там я получаю данные для первой связи:

 if ($parent['ctype_id']==21){ //Социальные учреждения, получаю тип учреждения

Чуть ниже для второй

и потом дальше после

            // Парсим форму и получаем поля записи
            $item = array_merge($item, $form->parse($this->request, $is_submitted));       

        ///////////////// Формирую автозаголовок
        $item['title'] = $parent_h_name. ' ('. $parent_so_type. ')';

Ну и получаю Notice: Undefined variable: parent_so_type

class actionContentItemAdd extends cmsAction {

    public function run(){

        // Получаем название типа контента
        $ctype_name = $this->request->get('ctype_name', '');
        if (!$ctype_name) {
            return cmsCore::error404();
        }

        // Получаем тип контента
        $ctype = $this->model->getContentTypeByName($ctype_name);
        if (!$ctype) {
            return cmsCore::error404();
        }

        $permissions = cmsEventsManager::hook('content_add_permissions', [
            'can_add' => false,
            'ctype'   => $ctype
        ]);

        $is_check_parent_perm = false;

        // проверяем наличие доступа
        if (!cmsUser::isAllowed($ctype['name'], 'add') && !$permissions['can_add']) {
            if (!cmsUser::isAllowed($ctype['name'], 'add_to_parent')) {
                if(!$this->cms_user->is_logged){
                    return cmsUser::goLogin();
                }
                return cmsCore::error404();
            }
            $is_check_parent_perm = true;
        }

        // проверяем что не превышен лимит на число записей
        $user_items_count = $this->model->getUserContentItemsCount($ctype['name'], $this->cms_user->id, false);
        if (cmsUser::isPermittedLimitReached($ctype['name'], 'limit', $user_items_count)){
            cmsUser::addSessionMessage(sprintf(LANG_CONTENT_COUNT_LIMIT, $ctype['labels']['many']), 'error');
            return $this->redirectBack();
        }

        // проверяем что не превышен лимит на число записей в сутки
        $user_items_24count = $this->model->getUserContentItemsCount24($ctype['name'], $this->cms_user->id, false);
        if (cmsUser::isPermittedLimitReached($ctype['name'], 'limit24', $user_items_24count)){
            cmsUser::addSessionMessage(sprintf(LANG_CONTENT_COUNT_LIMIT24, $ctype['labels']['many'], $ctype['labels']['two']), 'error');
            return $this->redirectBack();
        }

        // Проверяем ограничение по карме
        if (cmsUser::isPermittedLimitHigher($ctype['name'], 'karma', $this->cms_user->karma)){
            cmsUser::addSessionMessage(sprintf(LANG_CONTENT_KARMA_LIMIT, cmsUser::getPermissionValue($ctype['name'], 'karma')), 'error');
            return $this->redirectBack();
        }

        $item = [];

        if ($ctype['is_cats']){
            $category_id = $this->request->get('to_id', 0);
        }

        // Определяем наличие полей-свойств
        $props = $this->model->getContentProps($ctype['name']);
        $ctype['props'] = $props;

        // Если включены личные папки — получаем их список
        $folders_list = [];

        if ($ctype['is_folders']){
            $folders_list = $this->model->getContentFolders($ctype['id'], $this->cms_user->id);
            $folders_list = array_collection_to_list($folders_list, 'id', 'title');
            if($this->request->has('folder_id')){
                $item['folder_id'] = $this->request->get('folder_id', 0);
            }
        }

        // Получаем поля для данного типа контента
        $fields = $this->model->orderBy('ordering')->getContentFields($ctype['name']);

        $form = $this->getItemForm($ctype, $fields, 'add', [
            'folders_list' => $folders_list
        ]);

        // Связи
        $parents = $this->model->getContentTypeParents($ctype['id']);       
                
        if ($parents){
            foreach($parents as $parent){

                if (!$this->request->has($parent['id_param_name'])){
                    continue;
                }

                if (!cmsUser::isAllowed($ctype['name'], 'add_to_parent') && !cmsUser::isAllowed($ctype['name'], 'bind_to_parent')) {
                    $form->hideField($parent['id_param_name']);
                    continue;
                }

                $parent_id = $this->request->get($parent['id_param_name'], 0);
                
                if ($parent['ctype_id']==21){ //Социальные учреждения, получаю тип учреждения
                    $parent_props_21 = $this->model->GetParentContentProps($parent_id, $parent['ctype_name']);
                    $parent_so_type = $parent_props_21['8']['html'];
                }
                
                if ($parent['ctype_id']==19) { //Храмы, получаю наименование храма
                    $parent_props_19 = $this->model->GetParentContentProps($parent_id, $parent['ctype_name']);
                    $parent_h_name = $parent_props_19['title'];
                }
                
                $parent_item = $parent_id? $this->model->getContentItem($parent['ctype_name'], $parent_id): false;

                if($parent_item){

                    if (!empty($is_check_parent_perm) && !$this->cms_user->is_admin){
                        if (cmsUser::isAllowed($ctype['name'], 'add_to_parent', 'to_own') && $parent_item['user_id'] != $this->cms_user->id){
                            return cmsCore::error404();
                        }
                        if (cmsUser::isAllowed($ctype['name'], 'add_to_parent', 'to_other') && $parent_item['user_id'] == $this->cms_user->id){
                            return cmsCore::error404();
                        }
                    }

                    $item[$parent['id_param_name']] = $parent_id;
                    //$item[$parent['id_param_name']] = $parent_id;  // © MNN 2022-11-28
                    $relation_id = $parent['id'];

                }

                break;
            }
        }

        if (!empty($is_check_parent_perm) && empty($relation_id)){
            return cmsCore::error404();
        }

        // Заполняем поля значениями по умолчанию, взятыми из профиля пользователя
        // (для тех полей, в которых это включено)
        foreach($fields as $field){
            if (!empty($field['options']['profile_value'])){
                $item[$field['name']] = $this->cms_user->{$field['options']['profile_value']};
            }
            if (!empty($field['options']['relation_id']) && !empty($relation_id)){
                if ($field['options']['relation_id'] != $relation_id){
                    $form->hideField($field['name']);
                }
            }
        }

        $is_moderator = $this->controller_moderation->userIsContentModerator($ctype['name'], $this->cms_user->id, $item);
        $is_premoderation = cmsUser::isAllowed($ctype['name'], 'add', 'premod', true);

        $ctype = cmsEventsManager::hook('content_add', $ctype);
        list($form, $item) = cmsEventsManager::hook(«content_{$ctype['name']}_form», [$form, $item]);

        // Форма отправлена?
        $is_submitted = $this->request->has('submit') || $this->request->has('to_draft');

        // форма отправлена к контексте черновика
        $is_draf_submitted = $this->request->has('to_draft');

        // Передана категория, в которую добавляем
        if (!$is_submitted && !empty($category_id)) {

            $item['category_id'] = $category_id;

            if ($ctype['is_cats'] && $item['category_id'] > 1){
                $item['category'] = $this->model->getCategory($ctype['name'], $item['category_id']);
            }
        }

        $item['ctype_name'] = $ctype['name'];
        $item['ctype_id']   = $ctype['id'];
        $item['ctype_data'] = $ctype;

        if ($is_submitted){

            // Добавляем поля свойств для валидации
            if ($ctype['props']){
                $form = $this->addFormPropsFields($form, $ctype, [], $is_submitted);
            }
            
            // Парсим форму и получаем поля записи
            $item = array_merge($item, $form->parse($this->request, $is_submitted));       

        ///////////////// Формируем автозаголовок
        $item['title'] = $parent_h_name. ' ('. $parent_so_type. ')';
        

            // Проверям правильность заполнения
            $errors = $form->validate($this,  $item);

            if ($parents && $is_check_parent_perm){

                $perm = cmsUser::getPermissionValue($ctype['name'], 'add_to_parent');

                foreach($parents as $parent){
                    if (!empty($item[$parent['id_param_name']])){
                        $ids = explode(',', $item[$parent['id_param_name']]);
                        $this->model->filterIn('id', $ids);
                        $parent_items = $this->model->getContentItems($parent['ctype_name']);
                        if ($parent_items){
                            foreach($parent_items as $parent_item){
                                if ($perm == 'to_own' && $parent_item['user']['id'] != $this->cms_user->id) {
                                    $errors[$parent['id_param_name']] = LANG_CONTENT_WRONG_PARENT;
                                    break;
                                }
                                if ($perm == 'to_other' && $parent_item['user']['id'] == $this->cms_user->id) {
                                    $errors[$parent['id_param_name']] = LANG_CONTENT_WRONG_PARENT;
                                    break;
                                }
                            }
                        }
                    }
                }

            }

            list($item, $errors) = cmsEventsManager::hook('content_validate', [$item, $errors], null, $this->request);
            list($item, $errors, $ctype, $fields) = cmsEventsManager::hook(«content_{$ctype['name']}_validate», [$item, $errors, $ctype, $fields], null, $this->request);

            if (!$errors){

                if($is_draf_submitted){
                    $item['is_approved'] = 0;
                } else {
                    $item['is_approved'] = !$is_premoderation || $is_moderator;
                }

                $is_pub_control = cmsUser::isAllowed($ctype['name'], 'pub_on');
                $is_date_pub_allowed = $ctype['is_date_range'] && cmsUser::isAllowed($ctype['name'], 'pub_late');
                $is_date_pub_end_allowed = $ctype['is_date_range'] && cmsUser::isAllowed($ctype['name'], 'pub_long', 'any');
                $is_date_pub_days_allowed = $ctype['is_date_range'] && cmsUser::isAllowed($ctype['name'], 'pub_long', 'days');

                $date_pub_time = isset($item['date_pub'])? strtotime($item['date_pub']): time();
                $now_time = time();
                $now_date = strtotime(date('Y-m-d', $now_time));
                $is_pub = true;

                if ($is_date_pub_allowed){
                    $time_to_pub = $date_pub_time — $now_time;
                    $is_pub = $is_pub && ($time_to_pub < 0);
                }
                if ($is_date_pub_end_allowed && !empty($item['date_pub_end'])){
                    $date_pub_end_time = strtotime($item['date_pub_end']);
                    $days_from_pub = floor(($now_date — $date_pub_end_time)/60/60/24);
                    $is_pub = $is_pub && ($days_from_pub < 1);
                } else if ($is_date_pub_days_allowed && !$this->cms_user->is_admin) {
                    $days = $item['pub_days'];
                    $date_pub_end_time = $date_pub_time + 60*60*24*$days;
                    $days_from_pub = floor(($now_date — $date_pub_end_time)/60/60/24);
                    $is_pub = $is_pub && ($days_from_pub < 1);
                    $item['date_pub_end'] = date('Y-m-d', $date_pub_end_time);
                } else {
                    $item['date_pub_end'] = false;
                }

                unset($item['pub_days']);
                if (!$is_pub_control) { unset($item['is_pub']); }
                if (!isset($item['is_pub'])) { $item['is_pub'] = $is_pub; }
                if (!empty($item['is_pub'])) { $item['is_pub'] = $is_pub; }

                $item = cmsEventsManager::hook('content_before_add', $item);
                $item = cmsEventsManager::hook(«content_{$ctype['name']}_before_add», $item);

                $item = $this->model->addContentItem($ctype, $item, $fields);

                $item['ctype_name'] = $ctype['name'];
                $item['ctype_id']   = $ctype['id'];
                $item['ctype_data'] = $ctype;

                $this->bindItemToParents($ctype, $item, $parents);

                $item = cmsEventsManager::hook([
                    'content_after_add',
                    «content_{$ctype['name']}_after_add»
                ], $item, null, $this->request);

                if(!$is_draf_submitted){

                    if ($item['is_approved']){
                        cmsEventsManager::hook('content_after_add_approve', ['ctype_name' => $ctype['name'], 'item' => $item]);
                        cmsEventsManager::hook(«content_{$ctype['name']}_after_add_approve», $item);
                    } else {

                        $item['page_url'] = href_to_abs($ctype['name'], $item['slug']. '.html');

                        $succes_text = cmsCore::getController('moderation')->requestModeration($ctype['name'], $item);

                        if($succes_text){
                            cmsUser::addSessionMessage($succes_text, 'info');
                        }

                    }

                }

                $back_url = $this->getRequestBackUrl();

                if ($back_url){
                    return $this->redirect($back_url);
                } else {

                    if($is_draf_submitted){
                        return $this->redirectTo('moderation', 'draft');
                    }

                    if ($ctype['options']['item_on']){
                        return $this->redirectTo($ctype['name'], $item['slug']. '.html');
                    } else {
                        return $this->redirectTo($ctype['name']);
                    }

                }
            }

            if ($errors){
                cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
            }
        }

        $base_url = ($this->cms_config->ctype_default && in_array($ctype['name'], $this->cms_config->ctype_default))? '': $ctype['name'];

        $perms_notices = [
            'edit_times' => cmsUser::getPermissionValue($ctype['name'], 'edit_times'),
            'delete_times' => cmsUser::getPermissionValue($ctype['name'], 'delete_times')
        ];

        $back_url = $this->getRequestBackUrl();

        return $this->cms_template->render('item_form', [
            'do'               => 'add',
            'perms_notices'    => array_filter($perms_notices),
            'base_url'         => $base_url,
            'page_title'       => sprintf(LANG_CONTENT_ADD_ITEM, $ctype['labels']['create']),
            'cancel_url'       => ($back_url? $back_url: ($ctype['options']['list_on']? href_to($ctype['name']): $this->getBackURL())),
            'parent'           => isset($parent)? $parent: false,
            'ctype'            => $ctype,
            'item'             => $item,
            'form'             => $form,
            'props'            => $props,
            'is_moderator'     => $is_moderator,
            'is_premoderation' => $is_premoderation,
            'button_save_text' => (($is_premoderation && !$is_moderator)? LANG_MODERATION_SEND: LANG_SAVE),
            'button_draft_text' => LANG_CONTENT_SAVE_DRAFT,
            'hide_draft_btn'   => !empty($ctype['options']['disable_drafts']),
            'is_load_props'    => !isset($errors),
            'errors'           => isset($errors)? $errors: false
        ]);
    }

}

Добавлено спустя 18 часов

Не получается сохранить значение переменной, в которую попадает значение одного свойства первого связанного объекта. Даже пытался сохранять это полученное значение в глобальную  $GLOBALS['glvar'].

К сожалению, я плохо понимаю структуру контроллера. Я определил $GLOBALS['glvar'] в model.php выше остального кода. Все равно в процессе работы actions/item_add.php даже эта глобальная переменная обнуляется, когда происходит обработка и получение данных для второй по счету связи. Что-то я затупил. Ничего кроме как сохранить значение полученной переменной в файл, чтобы потом ее считать, придумать не могу.

#1 [ЕСТЬ РЕШЕНИЕ] Как программно получить значения полей и свойств связанного контента? 28 ноября 2022 в 17:07

ID связанного контента в коде доступен. Как по этому id можно получить значение поля 'title', а также значения некоторых свойств связанного контента?

Так будет верно?

        $model = new cmsModel();

        $parent_title = $model->getField('основная_таблица_связанного_объекта', $item['parent_id'], 'title');

Значения свойств хранятся в другой таблице. Осталось как-то добраться до свойств связанного объекта.

Проблема еще в том, что нужное свойство хранится в отдельной таблице cms_con_имя_связанного_объекта_props_values

И это только код значения фиксированного списка для этого свойства. А нужно его название..

#9 [ЕСТЬ РЕШЕНИЕ] После редактирования и сохранения записи контента происходит редирект фиг знает куда... 28 ноября 2022 в 13:41

Вопрос решен. Это касалось заказного компонента. Разработчик разобрался и исправил.

#10 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 14 ноября 2022 в 16:59

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

#11 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 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 и настройку. Все работает. Спасибо всем, кто откликнулся.

Изображение

#12 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 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, корректно ли отрабатывает автоматическая очистка устаревших файлов сессий?

#13 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 10 ноября 2022 в 16:55

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

#14 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 10 ноября 2022 в 15:12

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

IamB


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

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

#15 [ЕСТЬ РЕШЕНИЕ] cron настроен, задание sessionclean через него выполняется, но файлы устаревших сессий во временной папке не очищаются 10 ноября 2022 в 14:51

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

IamB

bool(false)

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

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

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

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