如何确定SOAP消息的最大大小


How is the max size of a SOAP message determined?

我在PHP 5.2.6上使用NuSOAP,我看到最大消息大小只有1000字节(这使得很难做任何有意义的事情)。这是在端点的WSDL中设置的,还是我可以在NuSOAP中配置的?

关于"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规范中有任何东西会限制整个消息正文的大小……单个参数(通过XMLSchema方面),但不是整个正文),否则限制似乎就在工具包中。

在生产箱上,我们使用PHP 5.2.5内置的Soap函数作为服务器,并在PHP 4上使用NuSoap,成功传输了大于1MB的消息。

我认为这两种产品都没有限制,但你应该在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)。