これは私が扱ってきた古い問題であり、まだ解決策がないので、新しいアプローチを試してみてください。
どうすればSOAP応答を早期に(スクリプトの実行が終了する前に)送信できますか?
これらの問題は、プロセスが割り当てられた時間よりも完了するのに時間がかかるため、ACKファイルが30秒前に送信されない場合に発生します。
flush()が機能しない場合、次のエラーが発生します:
org.xml.sax.SAXParseException:XMLドキュメント構造は、同じエンティティ内で開始および終了する必要があります。
flash()なしでこれを取得します
org.xml.sax.SAXParseException:ファイルの終わりが早すぎます。
スクリプトプロセスが完了するまでに180秒以上かかる場合があり、応答を待機しているサーバーは、タイムアウトする前に約30秒だけ待機します(これにより、上記のエラーが発生します)。
これを修正する方法について何か考えはありますか?
コードの一部を次に示します。これは、次のSOAPリクエストのACKファイルを受け入れて送信する方法です。
$data = 'php://input';
$content = file_get_contents($data);
if($content) {
respond('true');
} else {
respond('false');
}
応答機能
function respond($tf) {
$ACK = <<<ACK
<?xml version = "1.0" encoding = "utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<notifications xmlns="http://soap.sforce.com/2005/09/outbound">
<Ack>$tf</Ack>
</notifications>
</soapenv:Body>
</soapenv:Envelope>
ACK;
print trim($ACK);
}
PHPはシングルスレッド処理アプローチを使用しており、スレッドが処理を完了するまでACKファイルを送り返しません。ACK送信後にソケットを閉じて処理を続行し、送信サーバーでこれらのタイムアウトの問題が発生しないようにする方法はありますか?