当前位置: 首页 > 工具软件 > PHP Soap > 使用案例 >

php soapclient 参数,序列化 – 序列化PHP SOAPClient对象

牛迪
2023-12-01

我正在编写一个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;

}

……然后像这样称呼它……

$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(),但这具有完全相同的效果.

解决方法:

内置的SOAP扩展是一个不可判坏的二进制blob.很可能它并没有考虑到序列化.例如,它可能包含一个内部文件句柄,它不会在序列化/反序列化过程中存活.我建议你使用其他一些SOAP客户端,例如:

> Zend_Soap,Zend Framework的一部分.您不需要在代码的任何其他区域使用Framework,并且可能删除大多数其他组件.但是,它似乎在封面下使用现有的SOAP扩展,因此它可能不适合序列化.

> PEAR’s SOAP经常被引用,虽然它有点旧.

> NuSOAP最近已经从死里复活,尽管所有在线文档似乎已经消失在zip文件中.

如果这些都不合适,请考虑在本地缓存WSDL文件,因为我不知何故预计延迟就在哪里.来源:https://www.icode9.com/content-1-255701.html

 类似资料: