【问题标题】:Difference between SoapClient request and Soap curl request in phpphp中SoapClient请求和Soap curl请求的区别
【发布时间】:2015-08-26 11:28:38
【问题描述】:

我很困惑

Soap curl request我在这里找到了一个例子 SOAP request in PHP with CURL

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

我的问题和疑问是 首先 - 这两者是否具有相同的目的。

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

提前致谢

【问题讨论】:

    标签: php web-services curl soap


    【解决方案1】:

    我已经花费了无数个小时来处理 PHP 中的 SOAP。现在我可以声称我对它了如指掌。 :)

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

    第二个问题:在 cURL 中花费在本地执行上的 Speedwise 时间将是最少的。但这将被此类代码的低质量所抵消,因为它不会遵循 SOAP 标准,并且必然会以某种方式失败(它甚至可能不会让您知道它)。通常在执行过程中,大部分时间都花在传输上(即通过慢速网络/繁忙的网络服务器),因此您将使用哪种方式并不重要。

    现在让我们看看幕后花絮: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 相对容易。 mustUnderstand 在 cURL 中将很难做到。

    使用 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 用于 SOAP。我的回答是“是的”,有。不幸的是,PHP SOAP 无法创建某些类型的 SoapHeader 。因此,如果您使用这些高级的东西,您将需要使用 SoapClient 创建 SOAP 文档,然后使用一些 XML 工具(例如 PHP DOM)对其进行修改,然后使用 cURL 将其发送出去。但这完全是另一回事。

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

    【讨论】:

    • 请注意,您可以使用 ini_set("soap.wsdl_cache_enabled", 0); 禁用 PHP wsdl 缓存
    【解决方案2】:

    您说得对,它们具有相同的目的。不过,SoapClient 有很多内置的支持 SOAP 请求的功能,并且还在某处使用 Curl。

    正如您在讨论 SOAP with Curl 中看到的那样,程序员构建了 SOAP 信封,SoapClient 可以为您完成这些工作。进行方法调用也是如此。

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

    【讨论】:

    • 是否有任何性能差异和我应该使用一个而不是另一个的场景?
    • 如果你知道如何使用 curl 创建更好的实现,我猜 curl 可能会更快。我不会创建自己的实现。我们已经在大量应用程序中使用了 SoapClient,没有出现任何问题。
    • 我仍然觉得可以有更好的答案,有优缺​​点
    • 基本上这是正确的,SOAP 客户端稍微慢一些并且占用更多内存,但它为您做了很多繁重的工作。而在 curl 中处理 SOAP 请求需要您直接构建信封和编辑参数,但您使用的工具可能已经加载到内存中,而且速度很快。
    【解决方案3】:

    第一个问题: 坦率地说,它们在概念上填补了相同的利基。 有时您可能会认为在将其视为字符串进行一些修改后“打印”xml 会“更好”,而不是构建它并通过soap 发送它。 curl 可以做的不止这些,但是当应用于 ws soap 调用的上下文时,SOAP 会将请求视为“复杂”实体,而对于 curl,您的消息是一个简单明了的字符串..

    第二个问题: 这个我不能提供任何明确的答案.. 我知道你可以用 curl 做一些多发送,但我从来没有注意到任何特定的性能损失,另外还有一些像 zebra 这样的框架,它将 php curl 包装成一个(应该)性能提升,虽然我从未尝试过它们...... 但最终 curl 只会在肥皂卷曲的情况下“发送”一个字符串,所以我怀疑可能会有任何特定的性能下降..

    【讨论】:

    • 如果您需要 XML 字符串,您可以随时使用 SoapClient::__getLastRequest 或 SoapClient::__getLastResponse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2011-10-30
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多