问题 php中的SoapClient请求和Soap curl请求之间的区别


我很困惑

Soap curl request 我在这里找到了一个例子 PHP中的SOAP请求与CURL

和Soap请求使用 SoapClient PHP http://php.net/manual/en/class.soapclient.php

我的疑问和怀疑是 首先 - 这些都填补了相同的目的。

第二 - 如果它们用于相同目的,是否存在任何性能差异。

提前致谢


8114
2017-08-26 11:28


起源



答案:


你是对的,他们填补了同样的目的。虽然,SoapClient有很多功能可以支持内置的SOAP请求,并且也在某个地方使用Curl。

正如你在关于SOAP with Curl的讨论中所看到的,程序员构造了SOAP信封,SoapClient可以为你做到这一点。进行方法调用同样适用。

最后,使用SoapClient要容易得多。


6
2017-08-29 12:09



是否存在任何性能差异和场景,我应该使用哪一个? - Kuldeep Dangi
如果您知道如何使用curl创建更好的实现,我想curl可能会更快。我不会创建自己的实现。我们在大量应用程序中使用了SoapClient而没有任何问题。 - Roel Veldhuizen
我仍然觉得可以有更好的答案,有利有弊 - Kuldeep Dangi
基本上这是正确的,SOAP客户端稍微慢一点,内存密集程度更高,但它为您带来了很多繁重的工作。而在curl中处理SOAP请求需要您直接构建信封并编辑参数,但是您使用的工具可能已经加载到内存中,而且速度很快。 - J-Boss


答案:


你是对的,他们填补了同样的目的。虽然,SoapClient有很多功能可以支持内置的SOAP请求,并且也在某个地方使用Curl。

正如你在关于SOAP with Curl的讨论中所看到的,程序员构造了SOAP信封,SoapClient可以为你做到这一点。进行方法调用同样适用。

最后,使用SoapClient要容易得多。


6
2017-08-29 12:09



是否存在任何性能差异和场景,我应该使用哪一个? - Kuldeep Dangi
如果您知道如何使用curl创建更好的实现,我想curl可能会更快。我不会创建自己的实现。我们在大量应用程序中使用了SoapClient而没有任何问题。 - Roel Veldhuizen
我仍然觉得可以有更好的答案,有利有弊 - Kuldeep Dangi
基本上这是正确的,SOAP客户端稍微慢一点,内存密集程度更高,但它为您带来了很多繁重的工作。而在curl中处理SOAP请求需要您直接构建信封并编辑参数,但是您使用的工具可能已经加载到内存中,而且速度很快。 - J-Boss


我花了无数个小时在PHP中处理SOAP。现在我可以声称我内心深处知道了。 :)

第一个问题:SoapClient和cURL用于 不同的目的。 SoapClient是关于SOAP的,cURL是关于HTTP传输的。作为访问协议的SOAP比传输协议高一级。 SOAP可以通过您选择的任何传输进行传输:通常通过SMTP(即通过电子邮件)发送SOAP文档(它只是普通的XML文档),以便遍历限制性防火墙。 cURL只是一个访问某个Web服务器的工具。

第二个问题:在cURL中,在本地执行上花费的速度时间将是最小的。但是这样的代码质量低,因为它不会遵循SOAP标准,并且它必然会以这种或那种方式失败(它甚至不会让你知道它)。通常在执行中大部分时间都将用于传输(即通过慢速网络/繁忙的Web服务器),因此您将使用哪种方式无关紧要。

现在让我们来看看:PHP中的Soap扩展是非常不完整的。快速搜索单词“bogus”会在代码中产生33个不同的位置。他们中的大多数是php_encoding.c。不幸的是,PHP SOAP在某些情况下无法生成正确的SOAP或无法理解正确的SOAP - 互操作性是一个问题。大多数问题都在PHP和.NET SOAP之间,但我想如果您尝试使用cURL访问.NET SOAP,则需要的不仅仅是几行代码才能实现。幸运的是,普通的SOAP在PHP SOAP中非常好,并且可以与其他SOAP实现一起使用。如果你想使用SoapHeaders或mustUnderstand准备好让你有点噩梦。 SoapHeaders使用cURL相对容易。在cURL中,mustUnderstand很难做到。

使用SoapClient的主要好处是WSDL(Web服务描述语言)。基本上你可以这样做:

$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);

使用cURL,您将无法执行此操作,因为它没有WSDL解析器。如果远程端将更改其规格,cURL实现将失败并且不会让您知道。此时您可以说:但是如果远程Web服务器将静默删除executeRemoteFunction(),那么我也不会知道!事实并非如此:SoapClient抛出SoapFault异常,您需要捕获并处理它,否则您的脚本将以未处理的异常消息停止。无论哪种方式,你都会知道它。

但是,不要指望PHP SOAP为您做一些好的事情,比如类型检查。即使远程WSDL需要xs:integer,PHP SOAP也会忽略它,并且会发送你默认提供的任何类型。使用cURL进行类型检查?无法完成,因为首先没有WSDL支持。

在谈到SOAP WSDL时,请注意PHP将缓存WSDL 7天(默认设置)。在开发过程中快速更改WSDL会立即让您遇到麻烦:清除WSDL缓存并不总是那么容易。但另一方面,你可以在开发过程中完全禁用WSDL缓存:速度会下降,但至少你可以在没有“我不知道为什么它不能做我想要的东西!”的情况下开发。

因此,阅读PHP SOAP中的一些好东西你可能想知道是否有任何理由使用cURL for SOAP。我的回答是'是',有。不幸的是,PHP SOAP无法创建某些类型的SoapHeader。因此,如果您使用这些高级内容,则需要使用SoapClient创建SOAP文档,然后使用某些XML工具(例如PHP DOM)对其进行修改,然后使用cURL将其发送出去。但这完全是另一个故事。

如果你只是从PHP开始使用PHP,请自己帮个忙,坚持使用PHP SOAP扩展,而不是cURL。它是处理SOAP的更简洁的方法,它很快,维护扩展(所以期望它的互操作性最终上升),它理解WSDL并提供良好的错误报告和处理。


6
2017-09-04 20:20



请注意,您可以使用ini_set(“soap.wsdl_cache_enabled”,0)禁用PHP wsdl缓存; - Ricardo Martins


第一个问题: 坦率地说,他们在概念上占据了同样的位置。 可能有一段时间你认为将xml作为一个字符串进行一些修改后“打印”xml“更好”,而不是构建它并通过soap发送它。 curl可以做更多的事情,但是当应用于ws soap调用的上下文时,简单的SOAP会将请求视为“复杂”实体,而对于curl,您的消息是一个简单明了的字符串。

第二个问题: 这个我不能提供任何明确的答案..我知道你可以用curl做一些多发送,但我从来没有注意到任何特定的性能命中,加上有一些像斑马这样的框架,包裹了php curl for a(假设性能提升,虽然我从未尝试过...... 但最终curl只会在肥皂卷曲的情况下“发送”字符串,我怀疑可能会有任何特定的性能下降。


-1
2017-09-02 08:47



如果你需要XML字符串,你可以随时使用SoapClient :: __ getLastRequest或SoapClient :: __ getLastResponse - n3xus