【发布时间】:2010-09-18 21:12:14
【问题描述】:
我在 PHP 5.2.6 上使用 NuSOAP,我看到最大消息大小只有 1000 字节(这使得做任何有意义的事情变得困难)。这是在端点的 WSDL 中设置的还是我可以在 NuSOAP 中配置的?
【问题讨论】:
我在 PHP 5.2.6 上使用 NuSOAP,我看到最大消息大小只有 1000 字节(这使得做任何有意义的事情变得困难)。这是在端点的 WSDL 中设置的还是我可以在 NuSOAP 中配置的?
【问题讨论】:
关于 FUD 关于“1000 字节限制”...我查看了 nusoap_client 源代码,发现该限制仅对调试输出有效。
这意味着所有数据都被处理并传递到网络服务(无论其大小),但调试日志中仅显示前 1000 个字节(或更准确地说:字符)。
代码如下:
$this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000));
// send
$return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout);
如您所见,getHTTPBody() 调用使用了整个$soapmsg,并且只有调试输出限制为前 1000 个字符。如果您想更改此设置,只需更改 substr() 调用以满足您的需要,或者只需将其替换为 $soapmsg(因此所有内容也会显示在调试输出中)。
这应该与实际发送的数据的任何实际限制完全无关。当然可能还有其他因素实际上限制了您可以发送的内容的大小(例如,为您的 PHP 脚本设置的 RAM 限制、您的 HTTP 实现的限制或可用的虚拟内存不足),但理所当然地没有诸如可以使用 NuSOAP 发送的数据的“1000 字节限制”。
【讨论】:
我对 PHP 只是略知一二,从未使用过 NuSOAP 包。但是,SOAP 消息的大小应该只受传输介质的限制。在 HTTP 的情况下,它应该几乎是无限的(表单 POST 请求中 16384 字节的限制不是由于 SOAP,而是来自浏览器的限制(实际上可能不再存在,但我不确定) )。
我建议为 NuSOAP 的作者/维护者找到一个联系地址并直接询问他们。除非 WSDL 中有某些内容(而且我不记得 WSDL 规范中的任何内容会限制整个消息体大小......单个参数(通过 XML Schema 方面),而不是整个主体),那么限制似乎在工具包中。
【讨论】:
在生产机器上,我们使用 PHP 5.2.5 内置的 Soap 函数作为服务器,在 PHP 4 上使用 NuSoap,并成功传输了大于 1 MB 的消息。
我认为这两种产品都没有限制,但您应该检查 php.ini 中的设置
max_input_time (defaults to 60)
这是允许每个脚本解析输入的时间。如果在解析完成之前时间到了,脚本甚至不会运行。
旁注:如果可能,我建议迁移到 SoapClient/SoapServer PHP 扩展类。 NuSoap 已经证明自己在重负载情况下不是很可靠,尤其是在缓存方面。有时我们看到 NuSoap 只是简单地“忘记”了 wsdl 定义并在非 wsdl 模式下工作。奇怪...
【讨论】:
您还没有说您是在发送还是接收 SOAP 消息。如果您要发送,我会检查 NuSOAP 是通过 POST 而不是 GET 发送的(您可能必须深入研究代码才能看到;我发现文档很少)。如果您正在接收,请检查您的 PHP.INI 设置,了解内存和数据大小等内容。实际上,无论如何,请检查您的内存限制——NuSOAP 是一个相当大的内存消耗者,IIRC。
【讨论】:
我认为消息大小将受到 PHP 内存限制而不是某些硬编码值的限制。至少我可以毫无问题地发送一个 6.5MB 的字符串。当我尝试发送一个 8MB 的字符串时,我在 nusoap.php 中遇到了内存不足异常(我的服务器对 PHP 有 64MB 的限制)。
【讨论】: