Блог о 1C-Битрикс, MODX и OpenCart

MySQL-таблица занимает много места на диске, при малом количество данных в самой таблице

Кейс: в таблице (InnoDB) 39 записей на 65KB, а места на диске таблица занимает 2,6G:

user@site:~# du -sh /var/lib/mysql/site/* | grep b_composite_page
16K     /var/lib/mysql/site/b_composite_page.frm
2,6G    /var/lib/mysql/site/b_composite_page.ibd    

Почему так? Как почистить место?

Узнать больше

Написал аналог функции FIELD() в MySQL для Sphinx

В MySQL есть замечательная функция FIELD(). С её помощью, например, можно сортировать результаты выборки, зная точный порядок элементов.

Например, SELECT FIELD('c', 'a', 'b', 'c', 'd', 'e'); вернёт 3.

Понадобилась точно такая же функция, но в SphinxQL. Так в итоге родился плагин для Sphinx, о котором я расскажу в заметке.

Узнать больше

composer require и ошибка error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

При добавлении любого пакета, командой composer require, композер стал валиться с ошибкой.

Гуглились в основном решения с указанием файлов сертификатов в php.ini в опциях openssl.cafile и curl.cainfo.

Мне помогло простое решение:

Узнать больше

Пишем xml-строку в логи monolog без пробелов между xml-узлами

Если мы хотим записать xml-строку в логи с помощью пакета monolog, то строка запишется в одну строку с пробелами между xml-узлов.

Код решает эту проблему:

dlog(
    sprintf('xml response: "%s"', trim(
        call_user_func(
            function (\SimpleXMLElement $xml) {
                $dom = new \DOMDocument('1.0');
                $dom->preserveWhiteSpace = false;
                $dom->loadXML($xml->asXML());
                return $dom->saveXML();
            },
            $xml
        )
    ))
);

Под катом объяснение и пример.

Узнать больше

OrderHelper — класс-хелпер с аналогами методов классов CSaleOrder и CSaleOrderPropsValue для 1С-Битрикс

Написал класс-хелпер, в котором набор методов-аналогов классов CSaleOrder и CSaleOrderPropsValue с логированием ошибок, успешного сохранения, бэктрейсом. Для логирования используется логгер monolog.

Доступны методы:

\Olegpro\Helpers\OrderHelper::cancelOrder($orderId, string $value, string $comment = '', $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderPropertySingle($orderId, $code, $value, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderPropertyMultiply($orderId, array $values, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderField($orderId, $fieldName, $fieldValue, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setShipmentField($orderId, string $deliveryCode, string $fieldName, $fieldValue, $orderDeliveryId = null, $silenceMode = true): bool

Все методы подразумевают использование вне цикла сохранения заказа (внутри каждого используется \Bitrix\Sale\Order::save). Это важно учитывать или можно получить циклический вызов обработчиков ядра (но если сильно надо — то можно и обойти).

У всех последним параметром есть $silenceMode = true. Если его передать в false, то будет выкинуто исключение OrderHelperException.

С хелпером OrderHelper этих мамонтов можно забыть:

  • CSaleOrder::PayOrder
  • CSaleOrder::CancelOrder
  • CSaleOrder::StatusOrder
  • CSaleOrderPropsValue::Add
  • CSaleOrderPropsValue::Update
  • CSaleOrder::Update
Узнать больше