4

を使用して Web サービスへの非同期呼び出しを行うにはどうすればよいPHP SOAP Extensionですか?

4

9 に答える 9

4

私の当面の答えは次のとおりです。できません。
PHP には、「ユーザーランド」で使用できるスレッド機能がありません。

本当にやりたい場合は、いくつかの方法で回避できます。

  1. exec 関数を使用して、バックグラウンドで別のプロセスを生成し、データベース/ファイル システムなどを通じて監視します。
  2. fork 関数を使用して別のプロセスを生成し、データベース/ファイル システムなどを通じて監視します。

これら 2 つのアプローチの欠点は、非同期にできることですが、コールバックが必要な場合は、非常にトリッキーになり、簡単ではなくなります。非同期呼び出しを行うスクリプトでそれを待つことができないため、それはコールバックにもなりません。これは、ある種の監視スキームしか持てないことを意味します。私はAJAXをお勧めします。

于 2008-09-24T17:59:47.243 に答える
1

クライアントが切断された後も処理を継続する 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;
    }
}
于 2013-10-03T04:40:58.887 に答える
1

curl を使用する場合、複数のサーバーへの並列呼び出しを許可する一連の「マルチ」呼び出しがあります...

于 2009-08-12T11:07:36.807 に答える
1

役立つかもしれません (並列リモート プロシージャ コール): http://en.dklab.ru/lib/Dklab_SoapClient/

于 2011-01-10T19:36:11.147 に答える
0

AJAXタイプの呼び出しを使用して、サーバー側ではなくクライアント側で実行します。

于 2008-09-24T22:36:14.023 に答える
0

私の質問で彼らが私にくれた方法を試してみてください: Asynchronous PHP calls?

于 2008-09-24T23:52:03.327 に答える
0

Linux でコマンド ラインの php 呼び出しを実行できる場合は、pnctl_forkコマンドを実行して、フォークされた子プロセスから Web サービスを呼び出すことができます。

于 2008-09-24T18:14:03.870 に答える
0

グスタボが正しい答えであるため、なぜグスタボがモッドダウンされたのかわかりません。

exec を使用して、Google API に接続する PHP で記述されたシェル スクリプトを実行します。次のようにスクリプトを開始します。

run.php param1=1 param2=2 &> ajax.txt

実行の最後の行は

エコー「終了」

その後、私のajaxは、プロセスが終了するまで「ajax.txt」をポーリングし続けます。

ハックだけどシンプル (KISS)

モンク・イー・ボーイ

于 2008-10-02T09:07:31.503 に答える