Я работаю с сервером 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
и проверить вывод.Если я получу вывод «Успех», то я знаю, что мой скрипт будет работать без проблем.Если он не возвращает ничего, то я знаю, что мне нужно удалить файл кэша и позволить ему воссоздать его при запуске скрипта.Это кажется плохим методом, поэтому любые предложения будут с благодарностью.
Спасибо.