Ошибка молчания SoapClient из-за плохого кэша wsdl - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю с сервером SOAP для клиентского приложения.Спецификация большая, поэтому я использую кеширование, чтобы сократить время отклика.В большинстве случаев все работает без проблем.К сожалению, я начал сталкиваться с проблемой, когда кэш поврежден, что приводит к неожиданному и тихому завершению работы скрипта.Это функция, где выполнение останавливается:

private function connect() {
  try {
    $this->soap = new \SoapClient(self::WSDL, ['exceptions' => TRUE]);
    $this->soap->__setSoapHeaders(new \SoapHeader(self::URL, 'AuthHeader', $this->auth, TRUE));
  } catch (\SoapFault $e) {
    $this->error = "[{$e->faultcode}] {$e->faultstring}";
    $this->soap = NULL;
    $this->log($this->error);
    return FALSE;
  }
  return TRUE;
}

Для обычных ошибок это работает, как и ожидалось.Тем не менее, в этом случае исключение не возникает (я также пытался поймать \Exception на всякий случай, если это не SoapFault)

Я установил собственный обработчик ошибок, явынудил сообщить об ошибке на E_ALL, кажется, ничто из того, что я сделал, не объясняет сбой, поскольку я не получаю абсолютно никаких ошибок или предупреждений.Я проверил, чтобы убедиться, что предупреждения срабатывают, добавляя код мусора непосредственно перед созданием объекта SoapClient, такого как $a = ['key'=>'value'][$idontexist];, который добавляет ожидаемые предупреждения в файл журнала ошибок.

Способ, которым ячтобы определить, в чем проблема, нужно было просто добавить сообщения в стиле echo "STEP 1\n" каждое начало каждой функции в цепочке.После нескольких попыток его запуска он всегда останавливается на линии new \SoapClient.Если я установлю опцию на WDSL_CACHE_NONE, она загрузится и пойдет как положено.Точно так же, если я вручную удаляю файл кеша, он снова работает, и я могу часами работать без сбоев.Это кажется очень случайным, но это всегда решается при воссоздании кеша wsdl.

Я думаю, мой вопрос состоит из двух частей: 1.) Есть ли какая-то причина, почему я не могу захватитьошибка, чтобы узнать, когда мне нужно пересоздать кеш?2.) Есть ли хороший способ обнаружить, если кеш больше не действителен?До сих пор я думал только об одном методе - создать глобальный скрипт, подобный этому:

<?php
try {
  $soap = new SoapClient('<WSDL URL>', ['exceptions' => TRUE]);
} catch (Exception $e) {
  die;
}
echo 'Success';
?>

И затем запустить этот скрипт через shell_exec и проверить вывод.Если я получу вывод «Успех», то я знаю, что мой скрипт будет работать без проблем.Если он не возвращает ничего, то я знаю, что мне нужно удалить файл кэша и позволить ему воссоздать его при запуске скрипта.Это кажется плохим методом, поэтому любые предложения будут с благодарностью.

Спасибо.

...