php中SoapClient请求和soapcurl请求的区别

php中SoapClient请求和soapcurl请求的区别,php,web-services,curl,soap,Php,Web Services,Curl,Soap,我很困惑 Soap curl请求我在这里找到了一个示例 和使用SoapClientPHP的Soap请求 我的问题和疑问是 首先,这两者是否具有相同的用途 第二,如果它们用于相同的目的,是否存在性能差异 提前感谢你说得对,它们也有同样的用途。尽管如此,SoapClient内置了许多支持SOAP请求的功能,并且在某些地方也使用了Curl 正如您在关于SOAP和Curl的讨论中所看到的,程序员构造SOAP信封,SOAP客户端可以为您完成这项工作。方法调用也是如此 最后,使用SoapClient要容

我很困惑

Soap curl请求
我在这里找到了一个示例

和使用
SoapClient
PHP的Soap请求

我的问题和疑问是 首先,这两者是否具有相同的用途


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


提前感谢

你说得对,它们也有同样的用途。尽管如此,SoapClient内置了许多支持SOAP请求的功能,并且在某些地方也使用了Curl

正如您在关于SOAP和Curl的讨论中所看到的,程序员构造SOAP信封,SOAP客户端可以为您完成这项工作。方法调用也是如此

最后,使用SoapClient要容易得多

第一个问题: 坦率地说,它们在概念上占据了相同的位置。。 可能有一段时间,您认为在经过一些修改之后“打印”xml“更好”,将其作为字符串处理,而不是构建它并通过soap发送。。 curl可以做的不止这些,但是当应用于ws-soap调用的上下文时,simply soap将把请求视为“复杂”实体,而对于curl,您的消息是一个简单的字符串

第二个问题: 对于这个问题,我不能提供任何明确的答案。。我知道你可以用curl做一些多发送,但我从来没有注意到任何特定的性能影响,另外还有一些像zebra这样的框架,它包装了php curl以提高(假设的)性能,尽管我从未尝试过。。。
但最终,在使用soap curl时,curl只会“发送”一个字符串,所以我怀疑可能会有任何特定的性能下降。

我花了无数个小时在PHP中处理soap。现在我可以说我对它了如指掌

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

第二个问题:花在本地执行上的速度时间在cURL中是最小的。但这会被低质量的代码所抵消,因为它不会遵循SOAP标准,而且它注定会以某种方式失败(甚至可能不会让您知道)。一般来说,在执行过程中,大部分时间将花在传输上(即通过慢速网络/繁忙的web服务器),因此使用哪种方式无关紧要

现在让我们来看看幕后的情况:PHP中的Soap扩展是相当不完整的。快速搜索“伪造”一词会在代码中产生33个不同的位置。大多数都是php_encoding.c。不幸的是,PHP SOAP在某些情况下无法生成正确的SOAP或无法理解正确的SOAP—互操作性是一个问题。大多数问题都是PHP和.NETSOAP之间的问题,但我想,如果您试图使用cURL访问.NETSOAP,那么您需要的不仅仅是几行代码来启动它。幸运的是,普通SOAP在PHP SOAP中非常好,可以与其他SOAP实现一起使用。如果你想使用SoapHeaders或者mustUnderstand,那就准备好做一场噩梦吧。SOAPHeader相对容易使用cURL。mustUnderstand在cURL中很难做到

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

$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);
使用cURL,您将无法执行此操作,因为它没有WSDL解析器。若远程端将更改其规格,那个么cURL实现将失败,并且不会让您知道。此时,您可以说:但如果远程web服务器将静默地删除ExecuteMoteFunction(),那么我也不知道!事实并非如此:SoapClient带有抛出SoapFault异常,您需要捕获并处理它,否则脚本将停止并显示未处理的异常消息。不管怎样,你都会知道的

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

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

因此,在阅读PHP SOAP中的一些好东西时,您可能会想,是否有充分的理由将cURL用于SOAP。我的回答是“是的”,有。不幸的是,PHP SOAP无法创建某些类型的SoapHeader。因此,如果您使用这种高级工具,您将需要使用SoapClient创建SOAP文档,然后使用一些XML工具(如PHPDOM)对其进行修改,然后使用cURL发送它。但那完全是另一回事了


如果您只是从PHP中的SOAP开始,请帮自己一个忙,坚持使用PHP SOAP扩展,而不是cURL。这是一种更干净的处理SOAP的方法,它速度快,扩展得到了维护(因此预期其互操作性最终会提高),它理解WSDL并提供良好的错误报告和处理。

是否存在性能差异,以及我应该在哪些情况下使用它们?如果您知道如何使用curl创建更好的实现,我想卷曲可以更快。我不会创建自己的实现。我们已经在大量的应用程序中使用了SOAP客户端,没有任何问题。我仍然认为,在专业和专业方面,可能会有更好的答案。基本上,这是正确的,SOAP客户端稍微慢一点,而且速度更快