Dklab_SoapClientは、標準のPHPクラスSoapClientの拡張バージョンであり、負荷の高いプロジェクトでの並列(非同期)リモートプロシージャコール用に設計されています。
このライブラリを使用すると、たとえば、コンストラクタからのように、ブロックからサイトのページを構築できます。 すべての要求は並行して発生しますが、各ブロックは、SOAPを介して個別に要求されます。 ブログの1つが割り当てられた時間(タイムアウト)を満たさなかった場合、ページに表示されない場合があります。
組み込みのPHP SoapClientと比較して、追加機能がサポートされています。
- 複数のリモートプロシージャへのリクエストの同時並行実行は、ライブラリの重要な機能です。 サイトのページが5つの削除されたブロックから組み立てられ、各ブロックが100ミリ秒で生成される場合、それらを並行して実行して、ページ全体を500ミリ秒ではなく同じ100ミリ秒で取得できます。
- 通信できない場合は再接続してください。 残念ながら、世界は不完全であり、偶発的なパケット損失により、SOAPサーバーへの最初の接続試行がタイムアウトになる可能性があります。 これは、プロジェクトが複数のデータセンターにある場合に特に一般的です。 Dklab_SoapClientを使用すると、接続が開かれたときのタイムアウト(1秒など)を設定し、失敗した場合に指定された回数だけ再試行できます。 実際には、これにより、最終的な失敗の可能性が1,000倍減少します。 再接続は、ほとんど常にパケット損失に役立ちます。
- データを受信するためのタイムアウトのサポート。 ページが削除されたブロックから組み立てられている場合、ブロックの1つが「フリーズ」した場合、ページ全体も「フリーズ」します。 同時に、残りが存在するときにブロックの1つが存在しないことはそれほど大きな問題ではありません。 Dklab_SoapClientがリモートプロシージャからの応答を待つ時間を指定できます。 時間を超過すると、PHP例外が発生します。これは、残りのブロックのロードを中断することなく、必要に応じて処理できます。
なぜSOAPなのか? 一見すると、これは非常に面倒なプロトコルであり、適用が難しいように思われるかもしれません。 ただし、プロトコルの内部を詳しく調べなければ、PHP SOAPを使用するのが非常に便利であることがわかります。 WSDLスキームが不要な場合、最も単純なSOAPサーバーは次のように記述されます。
クラスMyServer
{
パブリック関数getComplexData($ some)
{
睡眠(1); //入力し、重いコードをエミュレートします
return array( "obj" =>(オブジェクト)array( "prop" => $ some)、 "some" => "thing");
}
}
$ soapServer = new SoapServer(null、array( 'uri' => 'urn:myschema'));
$ soapServer-> setObject(新しいMyServer());
$ soapServer->ハンドル();
対応するSOAPクライアントは次のようになります。
require_once "Dklab / SoapClient.php";
$ client = new Dklab_SoapClient(null、array(
'location' => "http://example.com/server.php"、
'uri' => 'urn:myschema'、
'timeout' => 3
));
//リクエストは並列に非同期で実行されます。 合計で-1秒間。
$ query1 = $ client-> async-> getComplexData(array( "abc"));
$ query2 = $ client-> async-> getComplexData(array( "xyz"));
print_r($ query1-> getResult());
print_r($ query2-> getResult());
重要なことは、PHPでSOAPを使用する場合、サーバーは任意の形式(オブジェクト配列の配列など)でデータを返すことができ、クライアントはパラメーター内の任意の構造の変数をサーバーに渡すことができる(オブジェクト配列の同じ配列など)。 この場合、すべての変換は自動的に実行されます。
なぜなら Dklab_SoapClientは組み込みのSoapClientの拡張機能であり、後者のすべての標準機能がサポートされています。
- Cookieを使用します。 1つのプロシージャはsetcookie()を呼び出し、別のプロシージャは後でこのcooikeの値を読み取ることができます。
- PHPセッションを操作します。 1つのプロシージャはセッションにデータを書き込み、2番目のプロシージャは読み取りを行います。
- WSDLスキームと複雑なビジネスオブジェクトの転送のサポート。
- リモートプロシージャで発生する例外の処理。
プロジェクトのApache Thriftが突然「スズメの銃の外」になった場合、Dklab_SoapClientはシンプルでコンパクトな代替手段として役立ちます。 (ところで、ThriftのPHPモジュールでは並列リクエストはサポートされていません-少なくともそこでは見つかりませんでした。)
ドキュメント、サンプル、自動テストを表示して、ライブラリをダウンロードしてください:
http :
//dklab.ru/lib/Dklab_SoapClient/PS
ところで、開発では
Gitとソーシャルネットワーク
GitHubを使用し
ています 。 他の人は試していないので、これを行うことをお勧めします。