<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">
 <channel>
	<title>Whatever</title>
	<link>http://dev.1c-bitrix.ru/community/blogs/whatever/</link>
	<description></description>
	<language>ru</language>
	<docs>http://backend.userland.com/rss2</docs>
	<pubDate>Fri, 17 Apr 2026 16:46:03 +0300</pubDate>

    <item>
      <title>PHP Fatal Error Handler - тащим E_ERROR в user space</title>
      <description><![CDATA[Коллеги, знакома ли вам боль от вида фаталов в логах, происхождение которых остается загадкой?<br />Больнее всего от каких-то часто используемых/общих методов:<br />
====code====
<pre>PHP Fatal error: Call to a member function smthd() on null in /var/www/some/factory/generic.php on line 13
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 30148784 bytes) in /var/www/bitrix/modules/main/lib/text/string.php on line 24</pre>
=============
Отлично PHP, я вижу OOM, но вызовов \Bitrix\Main\Text\String::htmlEncode несметное количество и начинать разборы причин попросту неоткуда, ведь кроме строки где мы упали и запроса пользователя ничего и нет. Язык для домашних страничек во всей красе, я считаю.<br />К сожалению PHP 5.x (в PHP 7.x есть <noindex><a href="https://wiki.php.net/rfc/engine_exceptions_for_php7" target="_blank" rel="nofollow" >engine exceptions</a></noindex>) не позволяет установить кастомный обработчик для ошибок типа E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR и E_COMPILE_WARNING, обоснованно считая это не безопасным. Поэтому ловить фаталы по аналогии с другими ошибками попросту не выйдет:(<br />Из всех &quot;не улавливаемых&quot; ошибок наиболее любопытен <noindex><a href="http://php.net/manual/en/errorfunc.constants.php#errorfunc.constants.errorlevels.e-error" target="_blank" rel="nofollow" >E_ERROR</a></noindex>, а типичное решение этой проблемы - зарегистрировать shutdown-функцию (<noindex><a href="http://php.net/manual/en/function.register-shutdown-function.php" target="_blank" rel="nofollow" >register_shutdown_function</a></noindex>) и там кетчить. Все в целом не так плохо, если вам не интересен stack trace, ибо его на момент вызова shutdown-функции уже нет.<br /><br />Так родился небольшой PHP-extension <noindex><a href="https://github.com/buglloc/php-fatal-handler" target="_blank" rel="nofollow" >PHP Fatal Error Handler</a></noindex>, который позволяет прокинуть в user space ошибки типа E_ERROR, что дает возможность обработать их нужным образом (i.e. сохранить) и достойно &quot;умереть&quot;. Стоит предупредить, что тут <b>важно понимать</b> что вы делаете и имплементить крайне аккуратно, ибо PHP обоснованно считает <b>прокидывание ошибок этого типа не безопасным</b>.<br />Собирается как и любое другое расширения (детально описано в README)<br />Пример использования:<br />
====code====
<pre>fatal_error_handler(function($code, $message, $file, $line) {
&nbsp;&nbsp;echo "Args: &#92;n";
&nbsp;&nbsp;var_dump(func_get_args());
&nbsp;&nbsp;echo "Trace: &#92;n";
&nbsp;&nbsp;debug_print_backtrace();
});
function test_error() {
&nbsp;&nbsp;fatal();
}
test_error();</pre>
=============
Вывод:<br />
====code====
<pre>Args: 
array(4) {
&nbsp;&nbsp;&#91;0&#93;=&#62;
&nbsp;&nbsp;int(1)
&nbsp;&nbsp;&#91;1&#93;=&#62;
&nbsp;&nbsp;string(34) "Call to undefined function fatal()"
&nbsp;&nbsp;&#91;2&#93;=&#62;
&nbsp;&nbsp;string(26) "/home/buglloc/tmp/test.php"
&nbsp;&nbsp;&#91;3&#93;=&#62;
&nbsp;&nbsp;int(10)
}
Trace: 
#0&nbsp;&nbsp;{closure}(1, Call to undefined function fatal(), /home/buglloc/tmp/test.php, 10) called at &#91;/home/buglloc/tmp/test.php:10&#93;
#1&nbsp;&nbsp;test_error() called at &#91;/home/buglloc/tmp/test.php:13&#93;</pre>
=============
Больше примеров можно посмотреть в <noindex><a href="https://github.com/buglloc/php-fatal-handler/tree/master/tests" target="_blank" rel="nofollow" >тестах</a></noindex> или <noindex><a href="https://github.com/buglloc/php-fatal-handler/tree/master/demo" target="_blank" rel="nofollow" >демо</a></noindex> с реализацией простого <noindex><a href="https://github.com/buglloc/php-fatal-handler/blob/master/demo/handler.php" target="_blank" rel="nofollow" >хендлера</a></noindex> ошибок/исключений:<br />
====code====
<pre>&#60;?php
require_once __DIR__ . '/handler.php';
$handler = new ErrorHandler;
$handler-&#62;register();
function foo() {
&nbsp;&nbsp;&nbsp;&nbsp;fatal();
}
function bar() {
&nbsp;&nbsp;&nbsp;&nbsp;foo();
}
// warning
strpos();
// fatal
bar();</pre>
=============
Вывод:<br />
====code====
<pre>E_WARNING: strpos() expects at least 2 parameters, 0 given in /home/buglloc/work/projects/php-fatal-handler/demo/test.php:16
#1 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(16): strpos()
#2 {main}
E_ERROR: Call to undefined function fatal() in /home/buglloc/work/projects/php-fatal-handler/demo/test.php:9
#1 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(13): foo()
#2 /home/buglloc/work/projects/php-fatal-handler/demo/test.php(19): bar()
#3 {main}
Ooops</pre>
=============
Это лишь пример, для того что бы показать суть использования расширения, не стоит бездумно подключать его на бою.<br /><br />Расширение должно работать со всей линейкой поддерживаемых версий PHP от 5.3 до 5.6, в том числе и с ZTS. За счет минимального оверхеда можно использовать в продакшене не боясь за производительность.<br />Если будут какие-то вопросы, предложения, замечания можете адресовать их в <noindex><a href="https://github.com/buglloc/php-fatal-handler/issues" target="_blank" rel="nofollow" >багтрекер</a></noindex><br /><br />Всем благ;)<br /><a href="http://dev.1c-bitrix.ru/community/blogs/whatever/16289.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/whatever/16289.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/whatever/16289.php</guid>
      <pubDate>Mon, 08 Feb 2016 11:51:59 +0300</pubDate>
    </item>

    <item>
      <title>Brick: альтернативный кирпич для мессенджера Битрикс24. Public alpha.</title>
      <description><![CDATA[Признаться, не знал с чего начать. Поэтому начну с тезисов:<br /> - Наш мессенджер развивается семимильными шагами, поэтому возможностей встроенного XMPP сервера и их клиентов просто перестало хватать.<br /> - Мне комфортно в GNU/Linux и когда пересаживаюсь за Windows или Mac OS, для каких-то тестов или экспериментов, испытываю некую боль.<br /> - Компания Битрикс, пока не готова делать версию десктопного приложения под GNU/Linux.<br /><br />В связи с этими тремя тезисами и родился свободный проект - <noindex><a href="https://github.com/buglloc/brick" target="_blank" rel="nofollow" >Brick</a></noindex>, как альтернативный клиент для нашего прекрасного мессенджера под GNU/Linux. Сейчас представляет из себя базовую оболочку, функциональности которой (как мне кажется) достаточно для того, что бы начать пробовать её использовать. Хорошо это иль плохо, но это не порт Windows/Mac OS версии официального клиента, а полностью альтернативная реализация со всеми вытекающими.<br />Хотел сразу обратить ваше внимание на то, что компания Битрикс не имеет прямого отношения к этому проекту. Он персональный, поэтому мы (Битрикс) не несем никакой ответственности за него. Решил поделиться, по большей части для таких же ценителей GNU/Linux и Битрикс24, которым не комфортно в веб-мессенджере.<br />Brick сейчас находится в активной стадии разработки и пока имеет ряд не столь значительных для основной функциональности "недоделок" и "шероховатостей" (e.g. не закончена интернализация).<br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/whatever/13310.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/whatever/13310.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/whatever/13310.php</guid>
      <pubDate>Wed, 01 Apr 2015 11:59:17 +0300</pubDate>
    </item>

  </channel>
</rss>