Принудительное повторное обновление ядра Bitrix

20.07.2020
Во время обновления все может пойти не так, как хочется, и выпасть ошибка обновления. Разработчики Битрикс позаботились о клиенте и дали возможность повторной загрузки обновлений, но сделали ее скрытой. Обновить ядро, перезагрузить только PHP-файлы Битрикса возможно повторно.
$url = "/bitrix/admin/update_system.php?BX_SUPPORT_PROTOCOL".date('j', time())."=Y"

ORM Битрикс (D7): быстрое получение количества элементов выборки без дополнительных запросов

16.05.2019
Вся магия в директиве SQL_CALC_FOUND_ROWS и функции SQL_CALC_FOUND_ROWS(), которая выдает количество записей предыдущего запроса с директивой, без учета установленного лимита. В итоге можем получить записи нужной нам сущности и организовать постраничную навигацию БЕЗ использования двух запросов: запрос количества, потом запрос записей. Директива SQL_CALC_FOUND_ROWS работает только в MySQL.
$params = array(
	'filter' => array(
		'ACTIVE' => 'Y',
		'>DATE_CREATE' => \Bitrix\Main\Type\DateTime::createFromTimestamp(time() - 86400))
	),
	'select' => array(
		new \Bitrix\Main\Entity\ExpressionField('FOUND_ROWS', 'SQL_CALC_FOUND_ROWS %s','ID'),
		'ID',
		'NAME',
	),
	'order' => array('ID'=>'asc'),
	'limit' => 10,
);

$rs = \Bitrix\Iblock\IblockElementTable::getList($params)->fetchAll();
$totalCount = 0;
if ($resultTotal = \Bitrix\Main\Application::getConnection()->queryScalar('SELECT FOUND_ROWS() as TOTAL'))
{ // более быстрое получение количества строк
	$totalCount = $resultTotal;
}

Получение свойств заказа по символьному коду в GetList через ORM Битрикс (D7)

09.10.2017
$orderFilter = array(
	'>=DATE_INSERT' => \Bitrix\Main\Type\DateTime::createFromTimestamp(time()-86400),
	'PROP__SOMEPROPERTY' => 'blablabla'
);

$params = array(
	'filter' => $orderFilter,
	'select' => array(
		'ID',
		'ACCOUNT_NUMBER',
		'DATE_INSERT',
		'PRICE',
		'CURRENCY',
		'DELIVERY_ID',
		'PAY_SYSTEM_ID',
		'PROP__SOMEPROPERTY' => 'SOMEPROPERTY.VALUE',
	),
);
$params['runtime'] = array(
	new \Bitrix\Main\Entity\ReferenceField(
		'SOMEPROPERTY',
		'\Bitrix\Sale\Internals\OrderPropsValueTable',
		array(
			'=this.ID' => 'ref.ORDER_ID',
			'=ref.CODE' => new \Bitrix\Main\DB\SqlExpression('?s', 'SOMEPROPERTY')
		)
	),
);

$rs = \Bitrix\Sale\Internals\OrderTable::getList($params);
while($r = $rs->fetch())
{
	var_export($r);
}
Работает с одиночными свойствами. Со множественными не проверял.

Перехват медленных хитов в Битрикс и их анализ в Xhprof

08.06.2017
Написал такую маленькую, но очень полезную штуку для отлова всех тормозных страниц на сайте.
На сервере должен быть установлен и настроен Xhprof. Как это сделать - погуглите :) Ну или здесь почитайте.
Скрипты интерфейса Xhprof у меня лежат в директории /xhprof-0.9.4/ в корне сайта. Можете вынести в свою директорию или вообще в отдельный домен можно это все разместить, чтобы все секьюрно и правильно было.
Вот, собственно, код который размещаем в /bitrix/php_interface/dbconn.php:
define('ENABLE_XHPROF',true);
if(ENABLE_XHPROF && function_exists('xhprof_enable'))
{
   global $getMicrotime;
   $getMicrotime = function(){
      list($usec,$sec) = explode(' ', microtime());
      return doubleval($usec) + doubleval($sec);
   };
   xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
   $GLOBALS['xhprof_start_time'] = $getMicrotime();
   register_shutdown_function(function() {
      global $getMicrotime;
      $xhprof_data = xhprof_disable();
      $tStart = $GLOBALS['xhprof_start_time'];
      $diffTime = $getMicrotime()-$tStart;
      if($diffTime > 1)
      {
         $timeF = round($diffTime, 3) . "";
         $timeF = str_replace('.', '-', $timeF);
         $client = $_SERVER['SHELL']?'shell':'http';
         $uri = $_SERVER['REQUEST_URI']?$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']:$_SERVER['PHP_SELF'];
         $uri = explode('/', $uri);
         $uri = implode('|',$uri);
         $xhprofCode = $client.'__'.$uri.'__'.$timeF.'s';
         $xhprofCode = preg_replace('#[^a-z0-9_|-]#i', '_', $xhprofCode);
         $pathXhprof = $_SERVER['DOCUMENT_ROOT'].'/xhprof-0.9.4';
         include_once $pathXhprof.'/xhprof_lib/utils/xhprof_lib.php';
         include_once $pathXhprof.'/xhprof_lib/utils/xhprof_runs.php';
         $xhprof_runs = new XHProfRuns_Default();
         $run_id = $xhprof_runs->save_run($xhprof_data, $xhprofCode);
      }
   });
}
Данный код отлавливает все хиты, работающие больше 1 сек, и заносит их в лог xhprof. В результате в логах Xhprof'а увидим вот такие записи:
Дааа, работы капец как много))
В имени каждого файла отмечается тип запроса к скрипту (http или shell), путь до скрипта и время работы скрипта.
Затем, попивая чай/кофе, можно спокойно проанализировать какие участки кода вам нужно доработать по вот таким наглядным графам вызова функций:

Еще один момент. Чтобы не было вот такого

нужно установить в PHP настройку mbstring.func_overload=0. Соответственно для Битрикса это будет плохо, поэтому интерфейс просмотра логов xhprof желательно вынести на отдельный хост.

Всё. Всем удачной охоты :)

Заметки по интеграции сайта на Битриксе с 1С

04.02.2016

Про DDoS

23.01.2016
Тут буду собирать информацию по методам DDoS-атак и защиты от них.

Особенности работы с BitrixVM

06.11.2015
Если в MySQL меняете пароль для root-пользователя, то его нужно так же прописать в файлах:
/etc/ansible/group_vars/bitrix-mysql 
/etc/ansible/group_vars/bitrix-web 
/root/.my.cnf

Настройки отправки email для всех сайтов лежат в файле /home/bitrix/.msmtprc. Без настройки параметров msmtp для конкретного сайта почта на этом сайте может не отправляться.

Поднимаем Битрикс на VDS на связке CentOS 7, nginx, php-fpm, MariaDB

23.10.2015
Заметка будет постепенно пополняться новыми деталями и корректироваться.

Работа со списком задач cron

16.08.2015
Посмотреть все выполняемые задачи пользователя "userLogin":
crontab -u userLogin -l
Чтобы отредактировать файл задач crontab сначала переключим редактор с vi на более удобный mcedit:
export EDITOR=mcedit
Затем отредактируем задачи cron, которые запускаются под пользователем "userLogin":
crontab -u userLogin -e
Проверяем запускалась ли задача:
grep CRON /var/log/syslog | tail -n 10
Записи 1 - 10 из 37
Начало | Пред. | 1 2 3 4 | След. | Конец