Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Битрикс портал — правка ошибки MySQL query error! Got a packet bigger than ‘max_allowed_packet’ bytes

Кейс от клиента:

При авторизации на портале Битрикс 24 (коробка) ошибка
MySQL query error! Got a packet bigger than ‘max_allowed_packet’ bytes
(весь текст не буду выкладывать — смысл понятен)

Если решать в лоб и быстро, то поможет

/etc/my.cnf
max_allowed_packet = 32M
service mysqld restart

решил разобраться, в чём собственно дело

видно, что на update в таблицу b_option идёт очень большое «тело»

нашел эту запись, посмотрел содержимое — массив с НЕУНИКАЛЬНЫМИ записями

небольшим скритом фиксим это дело прямо в php консоли

use Bitrix\Main\Config\Option;

$workgroupsToSync = Option::get('socialnetwork', 'workgroupsToSync', "");
$workgroupsToSync = ($workgroupsToSync !== "" ? @unserialize($workgroupsToSync, [ 'allowed_classes' => false ]) : []);
echo count($workgroupsToSync);

$i=0;
echo "
";
$arr = [];
foreach($workgroupsToSync as $idx=>$item) {
  if(!in_array($item, $arr)){
	array_push($arr, $item);
 }
}

echo count($arr);

Option::set('socialnetwork', 'workgroupsToSync', serialize($arr));

из 90к записей остаётся 147

далее в исходниках Битрика нашел интересное место в файле

www/bitrix/modules/socialnetwork/lib/item/workgroup.php

$workgroupsToSync = Option::get('socialnetwork', 'workgroupsToSync', "");
			$workgroupsToSync = ($workgroupsToSync !== "" ? @unserialize($workgroupsToSync, [ 'allowed_classes' => false ]) : []);
			if (!is_array($workgroupsToSync))
			{
				$workgroupsToSync = [];
			}
			$workgroupsToSync[] = array(
				'groupId' => $groupFields["ID"],
				'initiatorId' => (is_object($USER) ? $USER->getId() : $groupFields['OWNER_ID']),
				'exclude' => $exclude
			);
			Option::set('socialnetwork', 'workgroupsToSync', serialize($workgroupsToSync));

получили массив, добавили значение (но не посмотрели, вдруг оно уже присутствует) — фактически получаем постоянно раздуваемый массив

пришлось кастомизировать исходник Битрикса (а что делать?) — в Битрикс тоже отписал о этом «косяке»

сам фикс

$item = array(
			    'groupId' => $groupFields["ID"],
			    'initiatorId' => (is_object($USER) ? $USER->getId() : $groupFields['OWNER_ID']),
			    'exclude' => $exclude
			);

			if(!in_array($item, $workgroupsToSync)) {
			    array_push($workgroupsToSync, $item);
			    Option::set('socialnetwork', 'workgroupsToSync', serialize($workgroupsToSync));
			    \Bitrix\Socialnetwork\Update\WorkgroupDeptSync::bind(1);
			}

По идее такие огрехи при Code Review другим программистом должны «вылавливаться».

Share the post

Битрикс портал — правка ошибки MySQL query error! Got a packet bigger than ‘max_allowed_packet’ bytes

×

Subscribe to Gtalex – о работе в сети и не только

Get updates delivered right to your inbox!

Thank you for your subscription

×