SOAPメッセージの最大サイズはどのように決定されますか?
質問
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実装の制限、利用可能な仮想メモリの不足など)がありますが、 「1000バイトの制限」など。 NuSOAPで送信できるデータについて。
他のヒント
私はPHPに非常に精通しているだけで、NuSOAPパッケージをまったく使用したことがありません。ただし、SOAPメッセージのサイズは、トランスポートメディアによってのみ制限されます。 HTTPの場合、ほとんど無制限である必要があります(フォームPOSTリクエストの16384バイトの制限はSOAPによるものではなく、ブラウザーの制限によるものです(実際にはもう存在しないかもしれませんが、確かなことはわかりません) )。
NuSOAPの作成者/管理者の連絡先を見つけて、直接問い合わせることをお勧めします。 WSDLに何かがなければ(そして、全体の本文ではなく、メッセージボディサイズ全体を制限する個々のパラメーター(XMLスキーマファセット経由)を制限するWSDL仕様には何も思い出さない)ツールキットに含まれているようです。
プロダクションボックスでは、PHP 5.2.5ビルトインSoap関数をサーバーとして使用し、PHP 4でNuSoapを使用し、1 MBを超えるメッセージを正常に転送しました。
どちらの製品にも制限があるとは思いませんが、php.iniの設定を確認してください
max_input_time (defaults to 60)
これは、各スクリプトが入力を解析できる時間です。解析が完了する前に時間が経過すると、スクリプトは実行されません。
補足:可能であれば、SoapClient / SoapServer PHP拡張クラスに移行することをお勧めします。 NuSoapは、特にキャッシュに関しては、高負荷の状況ではあまり信頼性がないことが証明されています。 NuSoapが単に「忘れる」ということもありました。 wsdl定義およびnone-wsdl-modeでの作業。奇妙な...
SOAPメッセージを送信するか受信するかは言っていません。送信している場合、NuSOAPがGETではなくPOSTを介して送信していることを確認します(おそらく、コードを掘り下げて確認する必要があります。ドキュメントがまばらであることがわかりました)。受信している場合は、メモリやデータサイズなどについてPHP.INI設定を確認してください。実際には、とにかくメモリ制限を確認してください-NuSOAPはメモリを大量に消費するIIRCです。
メッセージのサイズは、ハードコードされた値ではなく、PHPのメモリ制限によって制限されると思います。少なくとも問題なく6.5MBの文字列を送信できました。 8MBの文字列を送信しようとしたときに、nusoap.php内でメモリ不足例外が発生しました(私のサーバーにはPHPの64MBの制限があります)。