По умолчанию агенты на кроне запускаются раз в минуту.
Для запуска раз в секунду используется скрипт-прослойка.
# Содержимое command-every-second.sh
#!/bin/bash
command=$@
# Пробелы и косые в команде заменяются на нижние подчеркивания.
no_spaces=`echo $command | sed -e 's/\s/_/g' -e 's|/|_|g'`
# Имя файла для блокировки на время выполнения основной команды.
lockfile=/tmp/$no_spaces.lock
# Раз в секунду пытаемся поставить блокировку на команду и выполнить.
for i in {1..60}
do
/usr/bin/flock -n $lockfile $command
/bin/sleep 1
done
rm $lockfile
# Пример команды для крона.
crontab -e
* * * * * nice -n 1 ionice -c2 -n4 /var/www/www-root/data/command-every-second.sh /opt/php81/bin/php -f /var/www/www-root/data/www/example.ru/bitrix/php_interface/cron_events.php >/dev/null 2>&1
Утилиты nice и ionice устанавливаем отдельно под рутом, если не установлены. Утилиты используются для запуска агентов на кроне с более низким приоритетом, чем другие процессы на сервере.
Устанавливаем консольную утилиту для конвертации картинок в webp Оригинал: https://www.digitalocean.com/community/tutorials/how-to-create-and-serve-webp-images-to-speed-up-your-website В оригинале есть как настроить для Ubuntu и Rewrite для Apache через .htaccess Для случаев, когда используется оригинальное имя картинки, требуется изменение в формировании webp_path. Например, в одну директорию заливают photo.jpeg и photo.png разного содержания, на выходе получается photo.webp для png, а картики в jpeg как будто и не было. Скрипты и настройки ниже делались для проекта с уникальными названиями картинок.
Сборка redis.so для ispmanager 5 Для php 8.1, для других версий меняется путь /opt/php74/, /opt/php82/ и т.д. Релизы в репозиториях igbinary и phpredis подбираются под версию php.
wget https://github.com/igbinary/igbinary/archive/refs/tags/3.2.14.zip -O igbinary.zip
unzip -o ./igbinary.zip
cd igbinary-3.2.14/
/opt/php81/bin/phpize
./configure --with-php-config=/opt/php81/bin/php-config
make && make install
#Обязательное расширение
echo 'extension=igbinary.so' > /opt/php81/etc/php.d/igbinary.ini
wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.zip -O phpredis.zip
unzip -o ./phpredis.zip
cd phpredis-5.3.7/
/opt/php81/bin/phpize
./configure --with-php-config=/opt/php81/bin/php-config --enable-redis-igbinary
make && make install
echo 'extension=redis.so' > /opt/php81/etc/php.d/redis.ini
#Рестарт сервера php, в данном случае apache
systemctl restart httpd
В php_info() проверить, что у redis появился доступный метод сериализации
Добрый день! Подскажите, пожалуйста, кто-то сталкивался с проблемой, когда при внесении изменений в элемент ИБ слетают стили? Конкретно при сохранении или применении правок разделяется тег <style> и его уже невозможно поправить: Доступ: контент-менеджер
Примерная команда для создания символической ссылки local на другую папку, в вашем случае может быть другой путь.
# путь может отличаться на сервере
# не запускать из под root, лучше под своим пользователем.
# !! сайт битрикса добавил в путь пробел.
#ln -s ../. ./www/local local
Мы делали общую папку local, раздельные папки local. Пришли к решению:
- при добавлении нового сайта на разных доменах всегда делать общую папку local, вместе с bitrix и upload - с разными папками local админка работает по-разному, в зависимости от домена под которым зашли - разные $_SERVER["DOCUMENT_ROOT"] и разные local, - делать общую папку /local, чтобы в админке были списки шаблонов сайта, и Битрикс ничего не ломал при сохранении настроек сайта, чтобы срабатывали все обработчики событий в админке и подключались все модули.
Фактически, при добавлении второго сайта приходится дорабатывать первый сайт, чтобы он поддерживал многосайтовость. Это можно включать в оценку работ по дополнительному сайту.
- обработчики будут вызываться на всех сайтах. Надо делать проверки внутри обработчиков для каких сайтов обработчики. Например, Обработчики для авторизации по телефону должны иметь настройки для каких сайтов. - обработчики можно указывать для одного из сайтов в /local/php_interface/s1/init.php, где s1 - id сайта , но в админке этот обработчик из /s1/init/php не вызовется - свои модули дорабатывать, чтобы поддерживали многосайтовость, если мешают работать одному из сайтов. - доработка модуля из маркетплейса, если не наш, - поменять версию с 1.1.0 на 1001.1.0, чтобы не обновлялся. Поменять название и описание, что модуль изменён и что в нём изменено. В будущем самостоятельно следить за модулем и его обновлениями, - шаблоны и классы, если они относятся только к одному сайту назвать с именем сайта в папке local. - шаблоны компонентов или сайтов с одинаковым именем переименовывать. Избегать имён шаблонов компонентов .default в шаблоне сайта .default - обработчики связанные с почтовыми шаблонами должны понимать для какого сайта обрабатывается письмо
Общая папка local избавляет от кучи проблем. Правда, создаются новые проблемы. Непонятно, к какому из двух сайтов относится общий код - желательно комментировать или переименовать. Но это лучше, чем неправильно работающая админка.
Здравствуйте, подскажите пожалуйста. Решил познакомиться с 1cbitrix и хочу научиться создавать свой шаблон с 0 для 1cbitrix. какие курсы и книги и другие источники информации посмоветуете?
Всем Доброго! Нужна помощь При использовании умного фильтра, не выдает результаты ,а окончание сайта filter/clear/apply/ ,при чем в каталоге он работает, а в другом разделе нет, есть ли идеи?
Расширение позволяет в два клика исключить директории кешей битрикса, а также директории upload и install. Файлы в исключенных директориях не индексируются, поэтому индексация проекта будет проходить быстрее. Также в автокомплите не будут подсказываться методы из install директорий модулей.
В Битрикс Управление Сайтом отсутствует возможность получения товаров которые указаны в правилах работы с корзиной, простыми словами товаров на которые применяются скидки. Написал класс для реализации такой возможности https://github.com/Cleverscript/ProductDiscount пользуйтесь, буду рад предложениям по доработке!
В 1С-Битрикс для уменьшения времени повторного создания страниц сайта используется механизм кеширования. Кеш позволит сохранить результат выполнения компонента - html шаблона, данные для заполнения метаданных страницы. Сайту не потребуется выполнять множество запросов к базе данных, расчет скидок и формирование шаблона на каждый хит.
Обратитесь в «Техдиректор» за помощью, если сталкиваетесь с проблемой долгого формирования страницы вашего сайта.
Методы создания кеша компонента
Для начала кеширования данных вызывается метод CBitrixComponent::StartResultCache(…) в качестве условия оператора if. Если данные в кеше актуальны, метод вернет false и тело оператора if будет пропущено.
Запись данных в кеш происходит при вывозе методов CBitrixComponent::EndResultCache() или CBitrixComponent::IncludeComponentTemplate(...). Метод должен быть расположен последним внутри блока if с вызовом метода CBitrixComponent::StartResultCache(…).
Пример кеширования с html-шаблоном:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных
$this->IncludeComponentTemplate(); // кеширование $arResult и html-шаблона
}
// установка мета-данных страницы
Пример кеширования только $arResult:
if ($this->StartResultCache($arParams['CACHE_TIME'], [ ...$additionalCacheId ]))
{
// загрузка данных $arResult для кеширования
$this->EndResultCache(); // кеширование только $arResult
}
// обработка запроса пользователя
$this->IncludeComponentTemplate();
HTML-шаблон одинаков для большой группы пользователей
Пользователь может сделать выбор, ввести данные
Данные в кеше
HTML-шаблона, $arResult, $templateData
$arResult
Выполнение result_modifier.php и template.php
Один раз
Каждый хит
Параметры запроса $_REQUEST, $_GET, $_POST, $_SESSION, $USER в result_modifier.php и template.php
Передавать в параметрах вызова компонента $arParams с приведением значения по допустимому списку вариантов.
Пример - вариант отображения списка или сортировка.
Без ограничений. Для вывода использовать функцию htmlspecialcharsbx() (уязвимость XSS).
Рекомендуется использовать данные $arResult.
Глобальные переменные (например, $APPLICATION) в result_modifier.php и template.php
Сохранить данные в $arResult или $templateData. Выполнить в component_epilog.php ^1.
Например, установка заголовка страницы ^2.
Без ограничений
Кеширование дополнительной выборки в result_modifier.php и template.php
Не требуется
Требуется
^1 - для вложенных компонентов component_epilog.php выполнится, если при вызове [$APPLICATION->IncludeComponent(...)](https://dev.1c-bitrix.ru/api_help/main/reference/cmain/includecomponent.php) передан аргумент $parentComponent. ^2 - обратите внимание, после component_epilog.php будет выполнен код компонента, расположенный ниже вызова метода CBitrixComponent::IncludeComponentTemplate(...), поэтому для установки метаданных может потребоваться изменить $component->arResult, т.к. компонент выполнит функции позже и переопределить глобально установленные значения.
Хранение кеша
Путь к файлу кеша формируется из директории кеша и md5-хеша идентификатора кеша.
По умолчанию директория кеша выглядит как bitrix/cache/{siteId}/{relativeComponentPath}/{salt} (например, bitrix/cache/s1/bitrix/catalog.smart.filter/59d). Переопределить директорию кеша компонента можно, передав аргумент $cachePath для метода CBitrixComponent::StartResultCache(…).
Идентификатор кеша, позволяет отличить файл кеша для вызова компонента в разных областях страницы и параметрах окружения. По умолчанию зависит от значений всех параметров компонента, идентификатора сайта, языка, шаблона сайта, временной зоны и порядковому номеру вызова на странице данного компонента. Разработчик может добавить собственные аргументы в идентификатор кеша, передав аргумент $additionalCacheID для метода CBitrixComponent::StartResultCache(…) (например, группы пользователя в зависимости от параметра CACHE_GROUPS).
Идентификатор кеша формируется в методе CBitrixComponent::GetCacheID(), может быть переопределен в собственном компоненте. В стандартных компонентах метод GetCacheID изменен только в компонентах bitrix:menu и bitrix:intranet.contact_center.list.
В качестве хранения системы хранения кеша можно выбрать Memcached или Redis. Обратите внимание, не рекомендуется использовать динамический sid для сайтов с многосайтовостью. Возможна проблема сброса кеша только по одному ключу sid.
Время кеширования
Время кеширования для компонентов с поддержкой тегированного кеша можно выбрать достаточно большим (например, один день). В случае изменения данных 1С-Битрикс автоматически отметит связанный кеш для удаления. По умолчанию при выборке данных из инфоблока [CIBlockResult::Fetch()](https://bxapi.ru/src/?module_id=iblock&name=CIBlockResult%3A%3AFetch) регистрируется тег инфоблока, поэтому вызов $CACHE_MANAGER->RegisterTag(...) необязателен. Стоить обратить внимание, что тег кеша скидок не регистрируется, поэтому при изменении скидок потребуется сбросить кеш вручную.
Особенность тегированного кеша 1С-Битрикс состоит в том, что при изменении любого товара, происходит сброс кеша всего каталога. Что приводит к проблеме, если при максимальной активности посетителей, изменения товаров происходят с периодичностью несколько раз в минуту. В таком случае рекомендуем выбрать время кеширования от 10 минут до 1 часа и отключить автоматическое тегирование перед вызовом компонента каталога.
В кеше стоит хранить компоненты на часто посещаемых страницах сайта и одинаковых для большой группы пользователей. Поэтому:
Кеширование при установленном фильтре (параметр CACHE_FILTER) стоит отключить по умолчанию. Включать, если используете дополнительный фильтр по умолчанию (заполняете $GLOBALS[$arParams['FILTER_NAME']]) и не выбраны дополнительные условия в смарт-фильтре. Также стоит включить CACHE_FILTER для страниц, ссылки на которые размещены на странице раздела в качестве тегов или используются в рекламе.
Список товаров в поиске также не стоит кешировать, т.к. кеш будет разным для каждого уникального запроса пользователя.
В персональном разделе покупателя использовать кеширование компонентов по умолчанию не требуется.
Если в параметрах компонента передаете генерируемые данные, которые со временем больше не могут быть использованы. Например, в качестве параметра компонента используете результат функции date('Y-m-d'). В таком случае потребуется реализовать агент, который будет очищать устаревший кеш (на основе \Bitrix\Main\Data\Cache::clearCache(...)), чтобы избежать переполнения места на диске.
PHP Fatal error: Declaration of Bitrix\Main\Diag\Logger::log($level, Stringable|string $message, array $context = []): void must be compatible with Psr\Log\LoggerInterface::log($level, $message, array $context = []) in ..../bitrix/modules/main/lib/diag/logger.php
Столкнулись с ошибкой, которую не удается зафиксировать в exception_handling 1С-Битрикс. Происходит фатальное исключение при попытке записать исключение в лог.
Обратитесь в «Техдиректор» за помощью, если сталкиваетесь с проблемой на вашем проекте.
Причина: 1. В главном модуле обновился пакет psr/log - для аргументов функции добавлено указание типов. 2. Класс для логирования exception_handling (Bitrix\Main\Diag\Logger) теперь так же реализует интерфейс с типами аргументов. 3. В проекте может быть загружена старая версия psr/log (без указания типов). Например, в php_interface или стороннем модуле.
Как происходит: 1. Класс Psr\Log\LoggerInterface загружается из старой версии psr/log (пункт №3) 2. Exception_handling 1С-Битрикс загружает Bitrix\Main\Diag\Logger (пункт №2). 3. PHP выбрасывает исключение, т.к. Bitrix\Main\Diag\Logger сужает набор типов аргумента относительно интерфейса. В PHP при наследовании можно только расширять набор типов аргументов функции или сужать тип возвращаемого значения ^1.
Как найти ошибку, если ничего не выводится и exception_handling не работает: 1. Проверьте error_log веб-сервера или файл, указанный в php.ini для error_log. 2. В начале скрипта вставьте register_shutdown_function с выводом последней зарегистрированной ошибки. Если в браузере не получается вывести ошибку, заполните $_SERVER['DOCUMENT_ROOT'] и запустите скрипт через ssh.
//$_SERVER['DOCUMENT_ROOT'] = ....; use for cli
register_shutdown_function(function() {
print_r(error_get_last());
});
Как найти старую версию psr/log, если столкнулись с таким текстом ошибки: 1. Перед строкой с проблемой можно вставить (например, в init.php). Обратите внимание, может давать разный результат в зависимости от порядка автозагрузки классов
$reflection = new ReflectionClass(\Psr\Log\LoggerInterface::class);
echo $reflection->getFileName();
2. Выполнить через ssh в директории сайта grep -r "namespace Psr\\\\Log;" --include=*.php . 3. Оригинальный psr/log лежит в файле bitrix/modules/main/vendor/psr/log/src/LoggerInterface.php. Если нашли имеено его, воспользуйтесь вторым вариантом поиска.
Что делать: 1. Удалить папку со старым psr/log, если расположена вне модуля. 2. Если расположена внутри модуля, переименовать папку psr/log внутри модуля. Написать разработчикам модуля. 3. Проверить, что сайт продолжает работать. В командной PHP-строке административной панели выполнить throw new RuntimeException('dummy');, проверить результат в логе exception_handling.
Чтобы избежать конфликта, устанавливайте зависимости composer, отключая загрузку пакетов, которые уже есть в главном модуле с помощью параметра replace. Для поддержки старых версий модуля main, реализуйте условный загрузчик на примере модуля techdir.sentry.
Здравствуйте, Создал свой обработчик для исходящего вебхука Битрикс24. Необходимо обработать поступившие данные при помощи Bitrix API. В момент как только подключаю prolog_before - скрипт останавливается по причине формы авторизации, которая возникает при обращении хука к файлу.
Можете, пожалуйста, направить на ход мыслей нужных или на курс обучения, где говорится про авторизацию хуков в своих обработчиках
В боковом меню ссылка на CRM направляет на главную страницу сайта, хотя в редактировании меню указан путь /crm/. Проявляется только у одного пользователя. У других пользователей формируется ссылка https://"адрес сайта"/crm/lead/?redirect_to. Шаблон для компонента меню используется left_vertical (Битрикс24 - Социальный интранет). Подскажите, пожалуйста, с чем может быть связано?
У меня есть один вопрос, кто может поделиться со мной CICD, когда у нас есть разработка, постановка и производство. Среды с точки зрения базы данных.Как мне перенести базу данных из среды разработки в промежуточную среду, чтобы база данных не была заражена? Или, например, у меня есть тестовый пользователь в базе разработки, и я не хочу, чтобы этот пользователь был Staging и Production. У нас есть бокс-версия Битрикс
Себе на память - что делать если при восстановлении из резервной копии выводится ошибка:
Ошибка! IP адрес клиента изменился, продолжение невозможно.
Самое простое решение это просто перезаписать файл restore.php свежезагруженным. Но если это в текущей ситуации неудобно, можно открыть существующий файл restore.php на редактирование и найти строки:
В первой строке файл записал ip адрес, с которого его первый раз запустили, во вторую строку - время первого запуска. Ошибки выдаются как при изменении ip адреса так и если прошло более суток с момента INIT_TIMESTAMP. Самое простое решение если нужно сохранить существующий файл но сбросить указанные значения - просто вписать туда плейсхолдеры по умолчанию:
Увидев такие плейсхолдеры скрипт при следующем запуске автоматически перезапишет их актуальными данными. Также можно вписать руками актуальный ip адрес и текущий timestamp - сработает аналогично.
Задача тривиальная и решений у нее много. В основном все "по старинке" дергают событие поступления почтового события и в нем что-то делают с массивом письма шаблона (дописывают недостающие и/или модифицируют имеющиеся).
Я набросал решение с класса \Bitrix\Sale\Notify, который не особо документирован, но с него накопировал кода под заполнение плейсхолдеров, как в шаблоне SALE_NEW_ORDER.
Ниже код, как пример использования, собрал на "быструю руку":