Кирилл

Кирилл

Был в сети 23 августа 2025, 08:08
Заказы принимаю
круто, больше нравится чем CronManager, хорошо проделанная работа)

Может стоит добавить в _ctma_task_log поле text? Чтобы иметь возможность сохранять каждый лог, а не только данные по последнему логу и на диске?
1) и конечно же читать каждый лог отдельно в задании
2) вкладку где будут все логи по всем заданиям
Под юзерами я имел в виду трафик на сайте согласно Яндекс Метрики
А зарегистрированных около ~35 тысяч было. Это было больше года назад сейчас всех данных не вспомню, особенно по строкам

Помню только что как только я переключил с smartSessionHandler на стандартный modSessionHandler — сразу начало работать как нужно :)

Я обсужу с Заказчиком такой тест — и смогу в будущем поделиться данными.

По настройкам было выставлено так:
smartsessions_authorized_users_gc_maxlifetime = 2592000
smartsessions_bot_signatures = DataForSeoBot|Googlebot|YandexBot|DotBot|bingbot|Mail.RU_Bot|PetalBot|MegaIndex.ru|YandexDirectDyn|Adsbot|SemrushBot|facebookexternalhit|SEO|Spider|YaDirectFetcher|BLEXBot|AhrefsBot|YandexMobileBot|MJ12bot|Barkrowler|crawler|YandexMetrika|Applebot|YandexMarket|python-urllib3|vkShare|UptimeRobot|Pinterestbot
smartsessions_bots_gc_maxlifetime = 259200
Приветствую
Вопрос, а проводилось ли тестирование работы под нагрузкой?
Потому что на smartSessions при сроке жизнь 1 месяц, и большом количестве посещений (около полумиллиона юзеров в месяц) — сильно тормозило проект. Сильно это измерялось в секундах вроде. Боты исключались понятное дело.
Вот мое решение, может сразу упросит поиск по поводу datetime
Данные в БД храню в integer формате в unixtimestamp
Мне важно получить дату до какого времени оплачен доступ у юзера, потому условно дата 01/01/2023, то сохраняю 01/01/2023 23:59:59 (GMT+0000)
Ну и соответственно потом показываю по разному данную дату (в подписи к полю — в привычном порядке для СНГ — день/месяц/год), а в самом поле, как по умолчанию месяц/день/год.
И да, для сохранения заюзал еще одно системное событие OnBeforeUserFormSave

<?php
/* userFields */
switch ($modx->event->name) {
    case "OnMODXInit":
        $map = array(
            'modUserProfile' => array(
                'fields' => array(
                    'surname' => '',
                    'patronymic' => '',
                    'paid' => '',
                ),
                'fieldMeta' => array(
                    'surname' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => false,
                        'default' => '',
                    ),
                    'patronymic' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => false,
                        'default' => '',
                    ),
                    'paid' => array(
                        'dbtype' => 'int',
                        'precision' => '10',
                        'phptype' => 'integer',
                        'null' => true,
                        'default' => null,
                    ),
                ),
            ),
        );

        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }

        break;

    case "OnUserFormPrerender":
        if (!isset($user) || $user->get('id') < 1) {
            return;
        }

        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
            $data['surname'] = htmlspecialchars($user->Profile->surname);
            $data['patronymic'] = htmlspecialchars($user->Profile->patronymic);
            $data['paid'] = date('m/d/Y', htmlspecialchars($user->Profile->paid));
            $dateRus = date('d.m.Y', htmlspecialchars($user->Profile->paid));

            $modx->controller->addHtml("
                <script type='text/javascript'>
                    Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                        this.on('beforerender', function() {
                            var leftCol = this.items.items[0].items.items[0].items.items[0];
                            var rightCol = this.items.items[0].items.items[0].items.items[1];

                            leftCol.items.insert(4, 'modx-user-surname', new Ext.form.TextField({
                                id: 'modx-user-surname',
                                name: 'surname',
                                fieldLabel: 'Фамилия',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['surname']}',
                            }));

                            leftCol.items.insert(5, 'modx-user-patronymic', new Ext.form.TextField({
                                id: 'modx-user-patronymic',
                                name: 'patronymic',
                                fieldLabel: 'Отчество',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['patronymic']}',
                            }));

                            rightCol.items.insert(0, 'modx-user-paid', new Ext.form.DateField({
                                id: 'modx-user-paid',
                                name: 'paid',
                                fieldLabel: 'Оплачено ДО конца этой даты rus: {$dateRus}',
                                xtype: 'datetime',
                                format: 'm/d/Y',
                                value: '{$data['paid']}',
                            }));

                        });
                    });
                </script>
            ");
        }

        break;

    case "OnBeforeUserFormSave":
        $user->Profile->set('surname', $_POST['surname']);
        $user->Profile->set('patronymic', $_POST['patronymic']);
        $user->Profile->set('paid', strtotime($_POST['paid'].' 23:59:59'));

        break;
}
Спасибо. Упустил момент :(
Немного пожив с включенным simpleQueue — почему-то дублируются заявки в AMO.
И ежедневно проскакивает ошибка 401 =/
1) Может быть связано с 401?
2) может ли помочь изменить CRON задачу с ежеминутного выполнения ~/www/core/components/amocrm/cron/secondlyrunner.php к примеру, на раз в 3 минуты?
Для того чтобы это сработало, в самом вызове надо указать что минимальный поиск от 2-х символов
Например:
[[!pdoPage?
    &element=`msProducts`
    &parents=`0`
    &resources=`[[!mSearch2:default=`999999`?returnIds=`1`&limit=`0`&minQuery=`2`]]`
    &sortby=`ids`
    &includeContent=`1`
    &includeThumbs=`big`
    &tplPagePrevEmpty=`@INLINE <li class="disabled"><span>«</span></li>`	
    &tplPageNextEmpty=`@INLINE <li class="disabled"><span>»</span></li>`	
    &tplPageWrapper=`	@INLINE <div class="pagination"><ul class="pagination">[[+prev]][[+pages]][[+next]]</ul></div>`
]]
Где добавляем
&minQuery=`2`
Либо же в быстром поиске.
[[!mSearchForm?
    &element=`msProducts`
    &includeThumbs=`small`
    &tplForm=`tpl.mSearch2.form_prom`
    &tpl=`tpl.mSearch2.ac_prom`
    &pageId=`21`
    &minQuery=`2`
]]
Эта конструкция вырезает удаляет переносы строк
$output = $html->save();
            $html->clear();
            unset($html);
            $output = preg_replace('|\s+|', ' ', $output);
Но как оказалось она работает в том числе и для документов со всеми типами содержимого, в том числе text

Можно ли как-то ограничить действие только для типа содержимого HTML или исключить для text?