我正在为客户端应用程序使用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
行处停止。如果将选项设置为<?php
try {
$soap = new SoapClient('<WSDL URL>', ['exceptions' => TRUE]);
} catch (Exception $e) {
die;
}
echo 'Success';
?>
,它将加载并按预期运行。同样,如果我手动删除缓存文件,它将再次起作用,并且我可以花费数小时而不会再次失败。这似乎是非常随机的,但是在重新创建wsdl缓存时总是可以解决。
我想我的问题分为两部分: 1.)是否有些原因导致我似乎无法捕获错误以了解何时需要重新创建缓存? 2)是否有一种很好的方法来检测缓存是否不再有效?到目前为止,我只想到了一种方法-创建这样的全局脚本:
shell_exec
然后通过{{1}}运行该脚本并检查输出。如果我获得“成功”输出,那么我知道我的脚本可以正常运行。如果它不返回任何输出,那么我知道我需要删除缓存文件,并在脚本运行时让它重新创建。 这似乎是一种糟糕的方法,所以任何建议都将不胜感激。
谢谢。