を使用して Web サービスへの非同期呼び出しを行うにはどうすればよいPHP SOAP Extension
ですか?
9 に答える
私の当面の答えは次のとおりです。できません。
PHP には、「ユーザーランド」で使用できるスレッド機能がありません。
本当にやりたい場合は、いくつかの方法で回避できます。
- exec 関数を使用して、バックグラウンドで別のプロセスを生成し、データベース/ファイル システムなどを通じて監視します。
- fork 関数を使用して別のプロセスを生成し、データベース/ファイル システムなどを通じて監視します。
これら 2 つのアプローチの欠点は、非同期にできることですが、コールバックが必要な場合は、非常にトリッキーになり、簡単ではなくなります。非同期呼び出しを行うスクリプトでそれを待つことができないため、それはコールバックにもなりません。これは、ある種の監視スキームしか持てないことを意味します。私はAJAXをお勧めします。
クライアントが切断された後も処理を継続する SoapServer クラスを作成する必要があります。この記事は出発点となりますが、SoapServer クラス内に同様のものをラップする必要があります。
おおよそ次のようになります (注: SoapServer 内でこれをテストしていませんが、これでアイデアが得られます)。
class NonBlockingSoapServer extends SoapServer
{
public function handle()
{
// this script can run forever
set_time_limit(0);
// tell the client the request has finished processing
header('Location: index.php'); // redirect (optional)
header('Status: 200'); // status code
header('Connection: close'); // disconnect
// clear ob stack
@ob_end_clean();
// continue processing once client disconnects
ignore_user_abort();
ob_start();
/* ------------------------------------------*/
/* this is where regular request code goes.. */
$result = parent::handle();
/* end where regular request code runs.. */
/* ------------------------------------------*/
$iSize = ob_get_length();
header("Content-Length: $iSize");
// if the session needs to be closed, persist it
// before closing the connection to avoid race
// conditions in the case of a redirect above
session_write_close();
// send the response payload to the client
@ob_end_flush();
flush();
/* ------------------------------------------*/
/* code here runs after the client diconnect */
/* YOUR ASYNC CODE HERE ...... */
return $result;
}
}
curl を使用する場合、複数のサーバーへの並列呼び出しを許可する一連の「マルチ」呼び出しがあります...
役立つかもしれません (並列リモート プロシージャ コール): http://en.dklab.ru/lib/Dklab_SoapClient/
AJAXタイプの呼び出しを使用して、サーバー側ではなくクライアント側で実行します。
私の質問で彼らが私にくれた方法を試してみてください: Asynchronous PHP calls?
Linux でコマンド ラインの php 呼び出しを実行できる場合は、pnctl_forkコマンドを実行して、フォークされた子プロセスから Web サービスを呼び出すことができます。
グスタボが正しい答えであるため、なぜグスタボがモッドダウンされたのかわかりません。
exec を使用して、Google API に接続する PHP で記述されたシェル スクリプトを実行します。次のようにスクリプトを開始します。
run.php param1=1 param2=2 &> ajax.txt
実行の最後の行は
エコー「終了」
その後、私のajaxは、プロセスが終了するまで「ajax.txt」をポーリングし続けます。
ハックだけどシンプル (KISS)
モンク・イー・ボーイ