【发布时间】:2011-03-23 14:34:56
【问题描述】:
我正在编写一个 PHP 应用程序,它使用许多 SOAP Web 服务来收集数据。
我在实例化所有这些对象时获得了巨大的开销:在某些情况下,一行代码$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;
}
那肯定是the way PHP recommends to do it。
...然后这样称呼它...
$client = soap_client('servicename',$wsdl);
$client->MethodName($parameters);
但是,它似乎不起作用。
第一次运行时,它可以工作(即创建对象并制作序列化副本,并且方法调用工作正常)。但是第二次运行它就失败了。
对象似乎可以正确地序列化和反序列化,但是当您尝试对反序列化的对象执行 SOAP 调用时,它会引发以下错误:
Fatal error: Uncaught SoapFault exception: [Client] Error finding "uri" property
很明显,反序列化的对象与原始对象不同,这与对象序列化的工作方式不一致。
谁能解释我为什么会收到这个错误?您能否建议一种让它发挥作用的方法,或者我可以说服的替代策略?
谢谢。
ps - 我已经尝试解决这个问题,但没有任何乐趣。
我尝试在 options 参数中指定 URI(在 PHP SOAP Client manual 中指定),但没有任何区别。但无论如何都没有必要,因为我使用的是 WSDL。
我也尝试过简单地将对象复制到$_SESSION,而不使用serialize() 和deserialize(),但效果完全相同。
【问题讨论】:
标签: serialization soap soap-client php