2016-12-12 37 views
2

AWSに非同期でリクエストを送信することはできますか?本当の意味で。私は方法でそれを送信しようとしている場合Amazon Firehoseへの非同期リクエスト

メッセージが配信されていません。

 $firehose = new FirehoseClient($args); 
     /** @var Promise\Promise $promise */ 
     $promise = $firehose->putRecordAsync($record); 
     $promise->then(function ($result) { 
      echo 'test'; 
     }); 

が、私は、スクリプトの最後に追加したとき:それが動作

$promise->wait() 

が、同期的に。非同期にする方法はありますか?しかし、常に同期モードでは、

$curl = new CurlMultiHandler(); 
    $handler = HandlerStack::create($curl); 
    $args = [ 
     'http_handler' => $handler, 
     'region' => '#REGION#', 
     'version' => 'latest', 
     'credentials' => $credentials, 
     'debug' => true 
    ]; 
    $firehose = new FirehoseClient($args); 

    while (!Promise\is_settled($promise)) { 
     $curl->tick(); 
    } 

は基本的にそれが動作:

は、私はまた、別のハンドラを使用することを試みました。私が必要とするのは、AWSにリクエストを送信し、その答えを待つことではありません。

+0

PHPを使用して、ウサギのMQを使用してみてくださいまたは何らかの形で私はPHPが非同期ではないことを知っているが、そこにあるキュー – bxN5

+0

を使用してcronを介して、あなたのスクリプトを呼び出すことができます 非同期ではありませんcurl関数:curl_multi_execは、バックグラウンドでリクエストを送信できるはずですか?さらに、公式のAWSドキュメント(https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/promises.html)をどのように理解する必要がありますか?何らかの非同期の方法があるはずです。私が間違っているなら、私を修正してください。 – user1119698

+0

@Romanでは、ジェネレータ(コルーチン)を追加した後、PHPにイベントループを持つ非同期コードを書く可能性があります。 –

答えて

1

問題の最適な解決策は、たとえばReactPHPのようなイベントループの実装を使用することです。

残念ながら、Guzzle(よく言えば、cURL自体)は、そのままのイベントループでは動作しません。

私は、イベントループに優しいGuzzleクエリを実行するためにbridgeを実装することで、同等の問題を解決しました。どうぞ、the examplesをご覧ください。

ので、コードは次のようになります。

run(function ($loop) use ($genFn) { 
    $httpHandler = new CurlMultiHandler($loop); 
    $stack = HandlerStack::create($httpHandler); 

    $httpClient = new Client([ 
     'handler' => $stack, 
    ]); 

    $promise = $httpClient->getAsync('https://google.com')->then(
     function ($result) { echo 'Query completed!'; }, 
     function ($reason) { echo 'Query failed.'; } 
    ); 

    /* 
    * The promise isn't completed yet, but the event loop will take care of it. 
    * We don't need to call Promise::wait()! 
    */ 
}); 
+0

標準待機より良いようですが、私の意見では完全に非同期ではありません。いくつかの印刷機能(print( 'TEST')をrun()関数の中に置くと、印刷を待っていることがわかります。間違っていれば修正してください。私はAmazon Firehoseにデータを転送する必要があり、プロセス/リクエストを送信する際に時間を無駄にしたくないのですが、このようにしてrun()プロセスの最後でも、スクリプトはすべてのデータを送信することをしばらく待っています。 – user1119698

0

私はPHPで非同期コードで動作しませんでしたが、私はPythonでこのようなことを行いました。

一般的な理解から、シンクコードで囲まれた単一の非同期要求の利点を得ることはできません。完全に非同期の環境で作業する必要があります(つまり、何らかの外部イベントループが必要です)。 ReactPHPはそれらの1つに見えます。

また、複数のAPIリクエストを同時に作成し、すべてのリクエストを一緒に待つことでメリットを得ることができます。この例のようにhttp://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/promises.html#executing-commands-concurrently複数の同期呼び出しを連続して行うよりも速く動作します。

私はそれが役に立ちそうです。

関連する問題