Сегодня мы поговорим об одном сюрпризе от разработчиков PHP, который меня немного улыбнул. Верней мне-то это особого неудобства не доставило, а вот коллеги, которые хендлят разные дебаги и фатальные ошибки были, мягко говоря, недовольны большим количеством спама на их почте. В чем же причина?
Все, кто работал с SOAP сервисами в PHP, знают, что в этом нет ничего сложного, благодаря наличию SOAP-расширения ( доступно в стандартной сборке PHP 5.х). Процесс обращения к сервису происходит примерно так:
$wsdl = ‘http://test.service.com/?wsdl’;
$options = array(‘trace’ => 1, ‘exceptions’ => true);
try {
$client = new SoapClient($wsdl’, $options);
$users = $client->getUsers();
} catch (SoapFault $e) {
echo $e->faultmessage;
}
Давайте рассмотрим опции, переданные клиенту:
- trace включает отслеживание запроса и в случае ошибки можно получить обратную трассировку. По умолчанию имеет значение FALSE.
- exceptions принимает булевые значения и определяет будут ли SOAP-ошибки бросать исключения типа SoapFault.
Полный список опций можно посмотреть здесь.
Включив опцию exceptions мы ожидаем, что все возможные ошибки будут возникать в виде исключений. Но если вдруг окажется, что недоступен файл WSDL, кроме исключения SoapFault возникнет фатальная ошибка - а вот и сюрприз! Да не простая ошибка … она каким-то чудным образом не прекращает выполнение скрипта. Но если не устанавливать опции exceptions в TRUE, то фатальная ошибка сработает как надо. Для многих это покажется не существенным, поскольку можно легко подавить их с помощью оператора @ или отключить отображение ошибок для конечного пользователя. Однако в случае использования дебаггеров, которые отлавливают фатальные ошибки с помощью функции error_get_last(), подобные фаталы очень даже отлавливаются, хотя и не несут вреда в практическом смысле.
Начал я искать решения данного момента и наткнулся на следующее. Оказывается, что эта ошибка существует с версии 5.2 и в версии 5.4 она до сих пор не исправлена. Разработчики посчитали, что это не баг :) А нам остается только мириться с неудобствами и использовать так сказать “as is” ...