我正在编写一个PHP应用程序,使用多个SOAP Web服务来收集数据。
在实例化所有这些对象时,我遇到了重大的开销:在某些情况下,一行代码
为了加快速度,我想把对象序列化并将它们存储在会话中(或类似地方),因此我编写了以下函数:
然而,它似乎不起作用。 第一次运行时,它运行正常(即创建对象并制作序列化副本,方法调用正常)。但是第二次运行时,它失败了。 该对象看起来已正确序列化和反序列化,但当您尝试在反序列化的对象上执行SOAP调用时,它将抛出以下错误:
在实例化所有这些对象时,我遇到了重大的开销:在某些情况下,一行代码
$object = new SoapClient($wsdl);
可能需要超过三秒钟。显然,只需要几个这样的操作就可以使网页感觉非常缓慢。为了加快速度,我想把对象序列化并将它们存储在会话中(或类似地方),因此我编写了以下函数:
function soap_client($name,$wsdl) {
if (!isset($_SESSION['soapobjects'][$name])) {
$client = new SoapClient($wsdl, array('trace' => 1));
$_SESSION['soapobjects'][$name]=serialize($client);
} else {
$client = unserialize($_SESSION['soapobjects'][$name]);
}
return $client;
}
看起来这确实是PHP推荐的做法。
...然后像这样调用它...
$client = soap_client('servicename',$wsdl);
$client->MethodName($parameters);
然而,它似乎不起作用。 第一次运行时,它运行正常(即创建对象并制作序列化副本,方法调用正常)。但是第二次运行时,它失败了。 该对象看起来已正确序列化和反序列化,但当您尝试在反序列化的对象上执行SOAP调用时,它将抛出以下错误:
Fatal error: Uncaught SoapFault exception: [Client] Error finding "uri" property
很明显,反序列化的对象与原始对象不同,这与对象序列化的预期工作方式不符。
有人能解释一下我为什么会得到这个错误吗?你能建议一种使其正常工作的方法或者我可以追求的替代策略吗?
谢谢。
附言 - 我已经尝试绕过这个问题,但是没有成功。
我已经尝试在选项参数中指定URI(如PHP SOAP Client手册中所述),但是并没有什么区别。但是这也不应该必要,因为我正在使用WSDL。
我还尝试了简单地将对象复制到$_SESSION
中,而不使用serialize()
和deserialize()
,但是效果完全相同。