我在 PHP 5.2.6 上使用 NuSOAP,我看到最大消息大小只有 1000 字节(这使得做任何有意义的事情变得困难)。这是在端点的 WSDL 中设置的,还是我可以在 NuSOAP 中配置的?
5 回答
关于关于“1000 字节限制”的 FUD……我查阅了 nusoap_client 源代码,发现该限制仅对调试输出有效。
这意味着所有数据都被处理并传递给 Web 服务(无论其大小),但调试日志中仅显示前 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 的限制)。