Кейс от клиента:
При авторизации на портале Битрикс 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 консоли
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
use Bitrix\Main\Config\Option; $workgroupsToSync = Option::get(‘socialnetwork’, ‘workgroupsToSync’, «»); $workgroupsToSync = ($workgroupsToSync !== «» ? @unserialize($workgroupsToSync, [ ‘allowed_classes’ => false ]) : []); echo count($workgroupsToSync); $i=0; echo «<pre>»; $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
1 2 3 4 5 6 7 8 9 10 11 12 |
$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)); |
получили массив, добавили значение (но не посмотрели, вдруг оно уже присутствует) — фактически получаем постоянно раздуваемый массив
пришлось кастомизировать исходник Битрикса (а что делать?) — в Битрикс тоже отписал о этом «косяке»
сам фикс
1 2 3 4 5 6 7 8 9 10 11 |
$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 другим программистом должны «вылавливаться».