<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Блог о веб-разработке — OlegPro</title>
    <link>https://www.olegpro.ru/rss/blog/</link>
    <description>Полезные заметки о веб-разработке</description>
    <item>
      <title>Ищем PHP-разработчика в команду Читай-Технологий</title>
      <link>https://www.olegpro.ru/post/ishchem_php_razrabotchika_v_komandu_chitay_tehnologiy.html</link>
      <description>&lt;p&gt;Привет!&lt;/p&gt;

&lt;p&gt;Давно мы с вами в этом блоге не виделись и на это есть ряд причин. Но речь сейчас не об этом :)&lt;/p&gt;

&lt;p&gt;Мы ищем PHP-разработчика в Платформенную команду Читай-Технологий.&lt;/p&gt;

&lt;p&gt;Платформа — набор качественных, надёжных сервисов и инструментов, с помощью которых, как из кирпичиков, мы быстро создаём новые продукты (как для онлайн-канала, так и для розничного).&lt;/p&gt;

&lt;p&gt;У нас:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;Тысячи RPS на бекенд&lt;/li&gt;
 &lt;li&gt;Symfony 7.2&lt;/li&gt;
 &lt;li&gt;DDD, Event-Driven&lt;/li&gt;
 &lt;li&gt;Развитая php-экосистема: собственные composer-пакеты, регламенты, митапы и книжные клубы&lt;/li&gt;
 &lt;li&gt;Микросервисная архитектура&lt;/li&gt;
 &lt;li&gt;Локальная разработка в Docker-окружении&lt;/li&gt;
 &lt;li&gt;Стенды под фичи, которые поднимаются за несколько минут&lt;/li&gt;
 &lt;li&gt;Kubernetes&lt;/li&gt;
 &lt;li&gt;Впечатляющий набор линтеров и статических анализаторов&lt;/li&gt;
 &lt;li&gt;Выстроенные процессы&lt;/li&gt;
 &lt;li&gt;И ещё куча всего крутого :)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Обновлено 14.07.2025&lt;/h3&gt;

&lt;p&gt;Кандидат найден, вакансию закрыли :)&lt;/p&gt;

&lt;p&gt;Если вам есть что предложить и вы хотите попробовать свои силы — пишите мне в &lt;a href="https://t.me/olegproru" target="_blank"&gt;телеграм&lt;/a&gt; или на почту &lt;a href="mailto:ya@olegpro.r"&gt;ya@olegpro.ru&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Переезд гит-репозитория с сохранением истории коммитов, веток, тегов</title>
      <link>https://www.olegpro.ru/post/pereezd_git_repozitoriya_s_sohraneniem_istorii_kommitov_vetok_tegov.html</link>
      <description>&lt;pre&gt;git clone --mirror &amp;lt;url_old_repo&amp;gt; .
git remote add new-origin &amp;lt;url_new_repo&amp;gt;
git push new-origin --mirror
&lt;/pre&gt;
</description>
    </item>
    <item>
      <title>MySQL-таблица занимает много места на диске, при малом количество данных в самой таблице</title>
      <link>https://www.olegpro.ru/post/mysql_tablica_mnogo_zanimaet_mesta_na_diske_pri_malom_kolichestvo_dannyh_v_samoy_tablice.html</link>
      <description>&lt;p&gt;Кейс: в таблице (InnoDB) 39 записей на 65KB, а места на диске таблица занимает 2,6G:&lt;/p&gt;

&lt;pre&gt;
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    
&lt;/pre&gt;

&lt;p&gt;Почему так? Как почистить место?&lt;/p&gt;

&lt;p&gt;Результат команды &lt;strong&gt;SHOW TABLE&lt;/strong&gt; таблицы:&lt;/p&gt;

&lt;pre&gt;
MariaDB [site]&gt; SHOW TABLE STATUS LIKE 'b_composite_page'\G;
*************************** 1. row ***************************
           Name: b_composite_page
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 39
 Avg_row_length: 420
    Data_length: 16384
Max_data_length: 0
   Index_length: 49152
      Data_free: 2648702976
 Auto_increment: 132230
    Create_time: 2018-02-11 00:49:29
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_unicode_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.01 sec)

ERROR: No query specified    
&lt;/pre&gt;

&lt;p&gt;Видим, что &lt;strong&gt;Data_free&lt;/strong&gt; (количество выделенных, но неиспользуемых байтов) заоблачный. При том, что &lt;strong&gt;Data_length&lt;/strong&gt; + &lt;strong&gt;Index_length&lt;/strong&gt; крохотный.&lt;/p&gt;

&lt;p&gt;При вставке в &lt;strong&gt;InnoDB&lt;/strong&gt;-таблицы место на диске увеличивается, а при удалении не уменьшается.&lt;/p&gt;

&lt;p&gt;Лечится это ребилдом таблицы:&lt;/p&gt;

&lt;pre&gt;
MariaDB [site]&gt; ALTER TABLE b_composite_page Engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0    
&lt;/pre&gt;

&lt;p&gt;При желании можно ещё запустить оптимизацию:&lt;/p&gt;

&lt;pre&gt;
MariaDB [site]&gt; OPTIMIZE TABLE b_composite_page;
+-----------------------+----------+----------+-------------------------------------------------------------------+
| Table                 | Op       | Msg_type | Msg_text                                                          |
+-----------------------+----------+----------+-------------------------------------------------------------------+
| site.b_composite_page | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| site.b_composite_page | optimize | status   | OK                                                                |
+-----------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.10 sec)    
&lt;/pre&gt;

&lt;p&gt;В итоге видим, что теперь всё стало больше похоже на правду:&lt;/p&gt;

&lt;pre&gt;
MariaDB [site]&gt; SHOW TABLE STATUS LIKE 'b_composite_page'\G;
*************************** 1. row ***************************
           Name: b_composite_page
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 40
 Avg_row_length: 409
    Data_length: 16384
Max_data_length: 0
   Index_length: 49152
      Data_free: 0
 Auto_increment: 132231
    Create_time: 2018-07-19 01:08:02
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_unicode_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

ERROR: No query specified    
&lt;/pre&gt;
</description>
    </item>
    <item>
      <title>MySQL. Удалить дубликаты повторяющихся записей, сохраняя последнюю</title>
      <link>https://www.olegpro.ru/post/mysql_udalit_dublikaty_povtoryayushchihsya_zapisey_sohranyaya_poslednyuyu.html</link>
      <description>&lt;p&gt;Решение одним запросом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="sql-hl-main"&gt;&lt;pre&gt;&lt;span class="sql-hl-reserved"&gt;DELETE&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;o&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;FROM&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;table&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;as&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;o&lt;/span&gt;
&lt;span class="sql-hl-reserved"&gt;INNER&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;JOIN&lt;/span&gt; &lt;span class="sql-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="sql-hl-reserved"&gt;SELECT&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;element_id&lt;/span&gt;&lt;span class="sql-hl-code"&gt;, &lt;/span&gt;&lt;span class="sql-hl-var"&gt;MAX&lt;/span&gt;&lt;span class="sql-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;id&lt;/span&gt;&lt;span class="sql-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;as&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;max_id&lt;/span&gt;
    &lt;span class="sql-hl-reserved"&gt;FROM&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;table&lt;/span&gt; 
    &lt;span class="sql-hl-reserved"&gt;GROUP&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;BY&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;element_id&lt;/span&gt; 
    &lt;span class="sql-hl-reserved"&gt;HAVING&lt;/span&gt; &lt;span class="sql-hl-var"&gt;COUNT&lt;/span&gt;&lt;span class="sql-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="sql-hl-code"&gt;*&lt;/span&gt;&lt;span class="sql-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="sql-hl-code"&gt; &amp;gt; &lt;/span&gt;&lt;span class="sql-hl-number"&gt;1&lt;/span&gt;
&lt;span class="sql-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;as&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;r&lt;/span&gt; &lt;span class="sql-hl-reserved"&gt;ON&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;o&lt;/span&gt;&lt;span class="sql-hl-code"&gt;.&lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;element_id&lt;/span&gt;&lt;span class="sql-hl-code"&gt; = &lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;r&lt;/span&gt;&lt;span class="sql-hl-code"&gt;.&lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;element_id&lt;/span&gt;
&lt;span class="sql-hl-reserved"&gt;WHERE&lt;/span&gt; &lt;span class="sql-hl-identifier"&gt;o&lt;/span&gt;&lt;span class="sql-hl-code"&gt;.&lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;id&lt;/span&gt;&lt;span class="sql-hl-code"&gt; &amp;lt; &lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;r&lt;/span&gt;&lt;span class="sql-hl-code"&gt;.&lt;/span&gt;&lt;span class="sql-hl-identifier"&gt;max_id&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
    </item>
    <item>
      <title>Написал аналог функции FIELD() в MySQL для Sphinx</title>
      <link>https://www.olegpro.ru/post/napisal_analog_funkcii_field_v_mysql_dlya_sphinx.html</link>
      <description>&lt;p&gt;В MySQL есть замечательная функция FIELD(). С её помощью, например, можно сортировать результаты выборки, зная точный порядок элементов.&lt;/p&gt;

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

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

&lt;p&gt;Дополнительные функции в Sphinx называются — &lt;a href="http://sphinxsearch.com/docs/current/sphinx-udfs.html" target="_blank" rel="nofollow"&gt;Sphinx UDFs&lt;/a&gt; (User Defined Functions).&lt;/p&gt;

&lt;p&gt;Свою функцию-аналог я назвал &lt;strong&gt;BK_FIELD&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Установка&lt;/h2&gt;

&lt;p&gt;Качаем с гитхаба исходники:&lt;/p&gt;

&lt;pre&gt;$ git clone https://github.com/olegpro/sphinx-udf-field.git

$ cd sphinx-udf-field
&lt;/pre&gt;

&lt;p&gt;Компилируем плагин из исходников:&lt;/p&gt;

&lt;pre&gt;$ make

$ sudo make install
&lt;/pre&gt;

&lt;p&gt;В этот момент в текущей папке появится файл bk_field.so. Он автоматически будет скопирован в папку /usr/local/sphinx/lib/&lt;/p&gt;

&lt;p&gt;Теперь нужно в конфиге сфинкса sphinx.conf указать путь к папке с плагинами:&lt;/p&gt;

&lt;pre&gt;common
{
    plugin_dir = /usr/local/sphinx/lib
}
&lt;/pre&gt;

&lt;p&gt;Осталось только зарегистрировать udf-функцию в сфинксе.&lt;/p&gt;

&lt;p&gt;Для этого подключаемся к сфинксу, примерно так:&lt;/p&gt;

&lt;pre&gt;$ mysql -h127.0.0.1 -P9306
&lt;/pre&gt;

&lt;p&gt;Регистрируем udf-функцию:&lt;/p&gt;

&lt;pre&gt;mysql&amp;gt; CREATE FUNCTION bk_field RETURNS BIGINT SONAME &amp;#039;bk_field.so&amp;#039;;
Query OK, 0 rows affected (0,00 sec)
&lt;/pre&gt;

&lt;h2&gt;Пример работы&lt;/h2&gt;

&lt;pre&gt;mysql&amp;gt; SELECT BK_FIELD(&amp;#039;c&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;e&amp;#039;);

+----------------------------------------+
| BK_FIELD(&amp;#039;c&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;e&amp;#039;) |
+----------------------------------------+
| 3                                      |
+----------------------------------------+
1 row in set (0.00 sec)
&lt;/pre&gt;

&lt;p&gt;Вот, собственно, и всё.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;Некоторые нюансы&lt;/h2&gt;

&lt;h3&gt;Функция BK_FIELD разрегистрируется&lt;/h3&gt;

&lt;p&gt;При использование udf-функций мы порой начали ловить ошибку:&lt;/p&gt;

&lt;pre&gt;ERROR 1064 (42000): Sphinx expr: syntax error, unexpected &amp;#039;(&amp;#039;, expecting $end near &amp;#039;(&amp;#039;c&amp;#039;, &amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;e&amp;#039;)&amp;#039;
&lt;/pre&gt;

&lt;p&gt;Как оказалось, что функция BK_FIELD просто разрегистрировалась в сфинксе после перезапуска демона searchd. Решение простое.&lt;/p&gt;

&lt;p&gt;Пишем sql-файл с содержимым регистрации плагина:&lt;/p&gt;

&lt;pre&gt;CREATE FUNCTION bk_field RETURNS BIGINT SONAME &amp;#039;bk_field.so&amp;#039;;
&lt;/pre&gt;

&lt;p&gt;Указываем этот файл в секции searchd в sphinx.conf:&lt;/p&gt;

&lt;pre&gt;searchd {
    sphinxql_state = /var/lib/sphinx/startup.sql
}
&lt;/pre&gt;

&lt;h3&gt;При компилировании в Visual Studio выдает ошибки&lt;/h3&gt;

&lt;p&gt;Плагин я писал в Visual Studio. При компилировании в Visual Studio выдает следующие ошибки:&lt;/p&gt;

&lt;pre&gt;&amp;quot;C:\Windows\SysWOW64\ntdll.dll&amp;quot;. Невозможно найти или открыть PDB-файл.
&amp;quot;C:\Windows\SysWOW64\kernel32.dll&amp;quot;. Невозможно найти или открыть PDB-файл.
&amp;quot;C:\Windows\SysWOW64\KernelBase.dll&amp;quot;. Невозможно найти или открыть PDB-файл.
&amp;quot;C:\Windows\SysWOW64\msvcp120d.dll&amp;quot;. Невозможно найти или открыть PDB-файл.
&amp;quot;C:\Windows\SysWOW64\msvcr120d.dll&amp;quot;. Невозможно найти или открыть PDB-файл.
&lt;/pre&gt;

&lt;p&gt;Решение: включить в настройках Visual Studio (Tool - Options) симовл серверов Microsoft и тогда ненайденные PDB файлы для системных библиотек будут загружены с сервера Microsoft:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;Полезные ссылки&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/olegpro/sphinx-udf-field" target="_blank"&gt;BK_FIELD на GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sphinxsearch.com/docs/current/sphinx-udfs.html" target="_blank" rel="nofollow"&gt;Sphinx UDFs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.cc#L4142" target="_blank" rel="nofollow"&gt;Реализация в mysql&lt;/a&gt;  (начинается со строки longlong Item_func_field::val_int())&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/seregayoga/go-sphinx-udf-example" target="_blank" rel="nofollow"&gt;Плагин для сфинкса на GO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://habrahabr.ru/post/155201/" target="_blank" rel="nofollow"&gt;Makefile для самых маленьких&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>ISPmanager, inode в Linux и заканчивающееся место</title>
      <link>https://www.olegpro.ru/post/ispmanager_inode_v_linux_i_zakanchivayushcheesya_mesto.html</link>
      <description>&lt;p&gt;Сегодня столкнулся с проблемой, что при установке пакета, apt стал падать с ошибкой о нехватке места на диске.&lt;/p&gt;

&lt;pre&gt;root@site:~# apt install htop
Чтение списков пакетов… Ошибка!
E: Could not create temporary file for /var/cache/apt/srcpkgcache.bin - mkstemp (28: На устройстве не осталось свободного места)
E: Списки пакетов или файл состояния не могут быть открыты или прочитаны.
&lt;/pre&gt;

&lt;p&gt;Команда &lt;strong&gt;df -h&lt;/strong&gt; при этом показывала, что место-то есть и его хватает:&lt;/p&gt;

&lt;pre&gt;
root@site:~# df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
udev               992M            0  992M            0% /dev
tmpfs              201M         5,5M  195M            3% /run
/dev/vda1           20G         9,9G  9,0G           53% /
tmpfs             1003M            0 1003M            0% /dev/shm
tmpfs              5,0M            0  5,0M            0% /run/lock
tmpfs             1003M            0 1003M            0% /sys/fs/cgroup
tmpfs             1003M            0 1003M            0% /tmp
tmpfs             1003M         8,0K 1003M            1% /var/spool/exim4
tmpfs              201M            0  201M            0% /run/user/0

&lt;/pre&gt;

&lt;p&gt;И как оказалось в linux есть понятие «инодов» (inode). Файл 10гб и 1мб занимают одну иноду. Их занятое количество можно померить с помощью &lt;strong&gt;df -i&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;root@site:~# df -i
Файловая система  Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
udev              253777           306    253471             1% /dev
tmpfs             256551           418    256133             1% /run
/dev/vda1        1280000       1267580     12420           100% /
tmpfs             256551             1    256550             1% /dev/shm
tmpfs             256551             3    256548             1% /run/lock
tmpfs             256551            15    256536             1% /sys/fs/cgroup
tmpfs             256551            15    256536             1% /tmp
tmpfs                500             1       499             1% /var/spool/exim4
tmpfs             256551            11    256540             1% /run/user/0
&lt;/pre&gt;

&lt;p&gt;Тут видно, что что в разделе /dev/vda1 они под завязку.&lt;/p&gt;

&lt;p&gt;После недолгих раскопок оказалось, что &lt;strong&gt;ISPmanager&lt;/strong&gt; никак не чистит php-сессии. Их стало очень дохера и иноды закончились.&lt;/p&gt;

&lt;p&gt;Решается просто:&lt;/p&gt;

&lt;pre&gt;/usr/bin/find /var/www/site/data/mod-tmp -mtime +10 -exec rm -rf {} \; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/pre&gt;

&lt;p&gt;Так мы удалим все сессии старше 10 дней. Так же эту команду надо добавить в крон, чтобы избежать переполнения инод.&lt;/p&gt;

&lt;p&gt;Кстати, сервер у меня в &lt;a href="https://www.ihor-hosting.ru/?from=90118" target="_blank"&gt;Айхоре&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>composer require и ошибка error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed</title>
      <link>https://www.olegpro.ru/post/composer_require_i_oshibka_error14090086ssl_routinesssl3_get_server_certificatecertificate_verify_failed.html</link>
      <description>&lt;p&gt;При добавлении любого пакета, командой composer require, композер стал валиться с ошибкой:&lt;/p&gt;

&lt;pre&gt;$ composer require vendor/package

[Composer\Downloader\TransportException]
  The &amp;quot;https://api.github.com/repos/vendor/package&amp;quot; file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
  error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
  Failed to enable crypto
  failed to open stream: operation failed


require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-suggest] [--no-update] [--no-scripts] [--update-no-dev] [--update-with-dependencies] [--update-with-all-depe
ndencies] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--] [&amp;lt;package
s&amp;gt;]...

&lt;/pre&gt;

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

&lt;p&gt;Мне помогло просто обновление самого composer:&lt;/p&gt;

&lt;pre&gt;composer self-update
&lt;/pre&gt;
</description>
    </item>
    <item>
      <title>Пример файла bitbucket-pipelines.yml для запуска Codeception тестов после изменения ветки</title>
      <link>https://www.olegpro.ru/post/primer_fayla_bitbucket_pipelinesyml_dlya_zapuska_codeception_testov_posle_izmeneniya_vetki.html</link>
      <description>&lt;p&gt;&lt;a href="https://ru.atlassian.com/software/bitbucket/features/pipelines" target="_blank" rel="nofollow"&gt;Bitbucket Pipelines&lt;/a&gt; — это CI/CD система для проектов в Bitbucket Cloud.&lt;/p&gt;

&lt;p&gt;В этой заметке покажу лишь пример файла bitbucket-pipelines.yml, для запуска авто-тестов Codeception. Подразумевается, что у вас в корне проекта есть composer.json, в котором прописана зависимость &lt;a href="https://packagist.org/packages/codeception/codeception" target="_blank" rel="nofollow"&gt;codeception/codeception&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bitbucket-pipelines.yml&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;image: php:7.0.30

pipelines:
  branches:
    dev:
    - step:
        deployment: test
        caches:
          - composer
        script:
          - apt-get update &amp;amp;&amp;amp; apt-get install -y unzip libfreetype6-dev libjpeg62-turbo-dev libpng12-dev git
          - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
          - docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
          - docker-php-ext-install -j$(nproc) gd
          - docker-php-ext-install bcmath zip
          - composer install
          - vendor/bin/codecept run
&lt;/pre&gt;

&lt;p&gt;Успешный билд выглядит вот так:&lt;/p&gt;

&lt;p&gt;&lt;a rel="gallery" href="/upload/images/post/bitbucket-pipelines-codeception-example/bitbucket-pipelines-codeception-build-big.jpg" title=""&gt;
    &lt;img src="/upload/images/post/bitbucket-pipelines-codeception-example/bitbucket-pipelines-codeception-build.jpg" alt="Пример файла bitbucket-pipelines.yml для запуска Codeception тестов после изменения ветки" title="Пример файла bitbucket-pipelines.yml для запуска Codeception тестов после изменения ветки" class="bordered" /&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Пишем xml-строку в логи monolog без пробелов между xml-узлами</title>
      <link>https://www.olegpro.ru/post/pishem_xml_stroku_v_logi_monolog_bez_probelov_mezhdu_xml_uzlami.html</link>
      <description>&lt;p&gt;Если мы хотим записать xml-строку в логи с помощью пакета monolog, то строка запишется в одну строку с пробелами между xml-узлов.&lt;/p&gt;

&lt;p&gt;Пример:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$xmlString&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;lt;&amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;span class="php-hl-string"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;catalog&amp;gt;
   &amp;lt;book id=&amp;quot;bk101&amp;quot;&amp;gt;
      &amp;lt;author&amp;gt;Gambardella, Matthew&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;XML Developer's Guide&amp;lt;/title&amp;gt;
      &amp;lt;genre&amp;gt;Computer&amp;lt;/genre&amp;gt;
      &amp;lt;price&amp;gt;44.95&amp;lt;/price&amp;gt;
      &amp;lt;publish_date&amp;gt;2000-10-01&amp;lt;/publish_date&amp;gt;
      &amp;lt;description&amp;gt;An in-depth look at creating applications with XML.&amp;lt;/description&amp;gt;
   &amp;lt;/book&amp;gt;
   &amp;lt;book id=&amp;quot;bk102&amp;quot;&amp;gt;
      &amp;lt;author&amp;gt;Ralls, Kim&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;Midnight Rain&amp;lt;/title&amp;gt;
      &amp;lt;genre&amp;gt;Fantasy&amp;lt;/genre&amp;gt;
      &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;
      &amp;lt;publish_date&amp;gt;2000-12-16&amp;lt;/publish_date&amp;gt;
      &amp;lt;description&amp;gt;A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.&amp;lt;/description&amp;gt;
   &amp;lt;/book&amp;gt;
&amp;lt;/catalog&amp;gt;
&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;EOF;&lt;/span&gt;&lt;span class="php-hl-code"&gt;
;
 
 
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;simplexml_load_string&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xmlString&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;dlog&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-identifier"&gt;sprintf&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;xml response: &amp;quot;%s&amp;quot;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;trim&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;asXML&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В логах будет запись:&lt;/p&gt;

&lt;pre&gt;
[2018-02-17 18:26:45] app.DEBUG: xml response: &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;catalog&amp;gt;    &amp;lt;book id=&amp;quot;bk101&amp;quot;&amp;gt;       &amp;lt;author&amp;gt;Gambardella, Matthew&amp;lt;/author&amp;gt;       &amp;lt;title&amp;gt;XML Developer&amp;#039;s Guide&amp;lt;/title&amp;gt;       &amp;lt;genre&amp;gt;Computer&amp;lt;/genre&amp;gt;       &amp;lt;price&amp;gt;44.95&amp;lt;/price&amp;gt;       &amp;lt;publish_date&amp;gt;2000-10-01&amp;lt;/publish_date&amp;gt;       &amp;lt;description&amp;gt;An in-depth look at creating applications with XML.&amp;lt;/description&amp;gt;    &amp;lt;/book&amp;gt;    &amp;lt;book id=&amp;quot;bk102&amp;quot;&amp;gt;       &amp;lt;author&amp;gt;Ralls, Kim&amp;lt;/author&amp;gt;       &amp;lt;title&amp;gt;Midnight Rain&amp;lt;/title&amp;gt;       &amp;lt;genre&amp;gt;Fantasy&amp;lt;/genre&amp;gt;       &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;       &amp;lt;publish_date&amp;gt;2000-12-16&amp;lt;/publish_date&amp;gt;       &amp;lt;description&amp;gt;A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.&amp;lt;/description&amp;gt;    &amp;lt;/book&amp;gt; &amp;lt;/catalog&amp;gt;&amp;quot; [] []
&lt;/pre&gt;

&lt;p&gt;Запись не выглядит единым целым, что мешает чтению логов (по крайней мере мне).&lt;/p&gt;

&lt;p&gt;Желаемого можно достичь с помощью &lt;strong&gt;\DOMDocument&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Пример:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$xmlString&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;lt;&amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;span class="php-hl-string"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;catalog&amp;gt;
   &amp;lt;book id=&amp;quot;bk101&amp;quot;&amp;gt;
      &amp;lt;author&amp;gt;Gambardella, Matthew&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;XML Developer's Guide&amp;lt;/title&amp;gt;
      &amp;lt;genre&amp;gt;Computer&amp;lt;/genre&amp;gt;
      &amp;lt;price&amp;gt;44.95&amp;lt;/price&amp;gt;
      &amp;lt;publish_date&amp;gt;2000-10-01&amp;lt;/publish_date&amp;gt;
      &amp;lt;description&amp;gt;An in-depth look at creating applications
      with XML.&amp;lt;/description&amp;gt;
   &amp;lt;/book&amp;gt;
   &amp;lt;book id=&amp;quot;bk102&amp;quot;&amp;gt;
      &amp;lt;author&amp;gt;Ralls, Kim&amp;lt;/author&amp;gt;
      &amp;lt;title&amp;gt;Midnight Rain&amp;lt;/title&amp;gt;
      &amp;lt;genre&amp;gt;Fantasy&amp;lt;/genre&amp;gt;
      &amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;
      &amp;lt;publish_date&amp;gt;2000-12-16&amp;lt;/publish_date&amp;gt;
      &amp;lt;description&amp;gt;A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.&amp;lt;/description&amp;gt;
   &amp;lt;/book&amp;gt;
&amp;lt;/catalog&amp;gt;
&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;EOF;&lt;/span&gt;&lt;span class="php-hl-code"&gt;
;
 
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;simplexml_load_string&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xmlString&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;dlog&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-identifier"&gt;sprintf&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;Xml-ответ после закупки товаров из 1С: &amp;quot;%s&amp;quot;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;trim&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-identifier"&gt;call_user_func&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;SimpleXMLElement&lt;/span&gt; &lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
                &lt;span class="php-hl-var"&gt;$dom&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;new&lt;/span&gt;&lt;span class="php-hl-code"&gt; \&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;DOMDocument&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;1.0&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
                &lt;/span&gt;&lt;span class="php-hl-var"&gt;$dom&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;preserveWhiteSpace&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;false&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
                &lt;/span&gt;&lt;span class="php-hl-var"&gt;$dom&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;loadXML&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;asXML&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
                &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-var"&gt;$dom&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;saveXML&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
            &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
            &lt;/span&gt;&lt;span class="php-hl-var"&gt;$xml&lt;/span&gt;
        &lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В логах уже будет приятная запись:&lt;/p&gt;

&lt;pre&gt;
[2018-02-17 18:26:45] app.DEBUG: xml response: &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;catalog&amp;gt;&amp;lt;book id=&amp;quot;bk101&amp;quot;&amp;gt;&amp;lt;author&amp;gt;Gambardella, Matthew&amp;lt;/author&amp;gt;&amp;lt;title&amp;gt;XML Developer&amp;#039;s Guide&amp;lt;/title&amp;gt;&amp;lt;genre&amp;gt;Computer&amp;lt;/genre&amp;gt;&amp;lt;price&amp;gt;44.95&amp;lt;/price&amp;gt;&amp;lt;publish_date&amp;gt;2000-10-01&amp;lt;/publish_date&amp;gt;&amp;lt;description&amp;gt;An in-depth look at creating applications with XML.&amp;lt;/description&amp;gt;&amp;lt;/book&amp;gt;&amp;lt;book id=&amp;quot;bk102&amp;quot;&amp;gt;&amp;lt;author&amp;gt;Ralls, Kim&amp;lt;/author&amp;gt;&amp;lt;title&amp;gt;Midnight Rain&amp;lt;/title&amp;gt;&amp;lt;genre&amp;gt;Fantasy&amp;lt;/genre&amp;gt;&amp;lt;price&amp;gt;5.95&amp;lt;/price&amp;gt;&amp;lt;publish_date&amp;gt;2000-12-16&amp;lt;/publish_date&amp;gt;&amp;lt;description&amp;gt;A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.&amp;lt;/description&amp;gt;&amp;lt;/book&amp;gt;&amp;lt;/catalog&amp;gt;&amp;quot; [] []
&lt;/pre&gt;

&lt;p&gt;Примечание: в заметке опущена реализация функции dlog() и предполагается, что к вам прилетает xml в виде &lt;strong&gt;\SimpleXMLElement&lt;/strong&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>OrderHelper — класс-хелпер с аналогами методов классов CSaleOrder и CSaleOrderPropsValue для 1С-Битрикс</title>
      <link>https://www.olegpro.ru/post/orderhelper__klass_helper_s_analogami_metodov_klassov_csaleorder_i_csaleorderpropsvalue_dlya_1s_bitriks.html</link>
      <description>&lt;p&gt;Написал класс-хелпер, в котором набор методов-аналогов классов CSaleOrder и CSaleOrderPropsValue с логированием ошибок, успешного сохранения, бэктрейсом. Для логирования используется логгер monolog.&lt;/p&gt;

&lt;p&gt;Доступны методы:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Olegpro&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Helpers&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;OrderHelper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cancelOrder&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderId&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;string&lt;/span&gt; &lt;span class="php-hl-var"&gt;$value&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;string&lt;/span&gt; &lt;span class="php-hl-var"&gt;$comment&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$silenceMode&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;: &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;bool&lt;/span&gt;&lt;span class="php-hl-code"&gt;
 
\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Olegpro&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Helpers&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;OrderHelper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setOrderPropertySingle&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderId&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$code&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$value&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$silenceMode&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;: &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;bool&lt;/span&gt;&lt;span class="php-hl-code"&gt;
 
\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Olegpro&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Helpers&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;OrderHelper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setOrderPropertyMultiply&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderId&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt; &lt;span class="php-hl-var"&gt;$values&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$silenceMode&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;: &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;bool&lt;/span&gt;&lt;span class="php-hl-code"&gt;
 
\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Olegpro&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Helpers&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;OrderHelper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setOrderField&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderId&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fieldName&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fieldValue&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$silenceMode&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;: &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;bool&lt;/span&gt;&lt;span class="php-hl-code"&gt;
 
\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Olegpro&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Helpers&lt;/span&gt;&lt;span class="php-hl-code"&gt;\&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;OrderHelper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setShipmentField&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderId&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;string&lt;/span&gt; &lt;span class="php-hl-var"&gt;$deliveryCode&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;string&lt;/span&gt; &lt;span class="php-hl-var"&gt;$fieldName&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fieldValue&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$orderDeliveryId&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;null&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$silenceMode&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;: &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;bool&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

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

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

&lt;p&gt;С хелпером OrderHelper этих мамонтов можно забыть:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSaleOrder::PayOrder&lt;/li&gt;
&lt;li&gt;CSaleOrder::CancelOrder&lt;/li&gt;
&lt;li&gt;CSaleOrder::StatusOrder&lt;/li&gt;
&lt;li&gt;CSaleOrderPropsValue::Add&lt;/li&gt;
&lt;li&gt;CSaleOrderPropsValue::Update&lt;/li&gt;
&lt;li&gt;CSaleOrder::Update&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Классы OrderHelper и OrderHelperException&lt;/h2&gt;

&lt;script src="https://gist.github.com/olegpro/af7a882cd5272316246111b7e7d330f0.js"&gt;&lt;/script&gt;
</description>
    </item>
  </channel>
</rss>
