Salesforce は、1 つの SOAP メッセージ内で最大 100 件の要求を送信できます。このタイプの Bulk Ooutbound メッセージ要求を送信しているときに、PHP スクリプトは実行を終了しますが、SF は、Salesforce 側でメッセージ キューをクリアするために使用される ACK を受け入れることができません。アウトバウンド メッセージ ログ (監視) を見ると、すべてのメッセージが保留状態で、配信失敗の理由が "java.net.SocketTimeoutException: Read timed out" であることがわかります。スクリプトの実行が終了しているのに、なぜこのエラーが発生するのですか?
Salesforce側にアクセスできないため、サーバーでの実行時間を増やすためにこれらの方法を試しました。
- set_time_limit(0); // スクリプト内
- max_execution_time = 360 ; 各スクリプトの最大実行時間 (秒単位)
- 最大入力時間 = 360 ; 各スクリプトがリクエスト データの解析に費やす最大時間
- メモリ制限 = 32M ; スクリプトが消費するメモリの最大量
テストのためだけに高い設定を使用しました。
なぜこれが Salesforce への ACK 配信に失敗するのかについて何か考えはありますか?
コードの一部を次に示します。これは、着信する 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);
}
これらは、特定のワークフローのデータを使用するスクリプトに含める汎用スクリプトにあります。約 25 のリクエストを処理できます (1 つの SOAP 応答に含まれます) が、それを超えると、Salesforce キューでタイムアウト エラーが発生します。50 リクエストの場合、通常、私の PHP スクリプトは 86.77 秒かかります。
それはApacheでしょうか?PHP?
また、100 リクエストの SOAP 応答を受け入れるだけで、キューがクリアされる ACK を受け入れて送信することもテストしました。
Apache ログにエラーは表示されません。スクリプトは正常に実行されます。
Salesforce サイトでいくつかの情報を見つけましたが、まだ運がありません。ここにリンクがあります。
また、PHP Toolkit 11 (Salesforce から) を使用しています。
これについての洞察に感謝します、 --Phill
アップデート:
着信メッセージを受信して応答を出力した場合、後で何かを行うかどうかに関係なく、これを最初に行う必要がありますか? それとも、プロセスが終了するのを待ってから応答を出力しますか?
更新#2:
OK、問題があると思います。PHP はシングル スレッド処理アプローチを使用しており、スレッドが処理を完了するまで ACK ファイルを送り返しません。これをマルチスレッドプロセスにする方法はありますか? スレッド #1 - 着信 SOAP 要求を受け入れて ACK を送り返す スレッド #2 - SOAP 要求を処理する
DBテーブルやフラットファイルのように分割できることは知っていますが、それを行わずにこれを達成する方法はありますか?
ACK送信後にソケットを閉じて処理を続行しようとしていますが、うまくいくと思います。