2017-06-24 8 views
0

ウェブサイトのドキュメントhttp://amphp.org/faqはあまり明確ではありません。物事は私には混乱しています。それはサーバーとして動作することを意図していますか? CLIとして実行しますか?またはWebコンテナ(apache、nginx fpm)内で実行しますか?そしてphpは本質的に同期しています。pthreadのような拡張機能をサポートしていないと、どうしたら非同期になりますか?amphpはどのように動作するのですか

編集---

アンプの潜在的なアプリケーション:バックグラウンドスレッド?ユーザーが注文を提出するような簡単な使用例では、phpは注文に応じて話をして注文を処理することがあります。だから、私たちはスレッドを使用したい(Javaサーブレットのようなものです)、ユーザーを待たせることはありません。私たちはcron-jobやadditional-ajaxで行うことができますが、醜いですし、この非同期要求をたくさん持っています。

+0

Ampは、イベントループ、約束事、および非同期イテレータなどの並行性を管理するためのプリミティブを提供するPHPのための**並行性フレームワーク**です。 (リンクされたページから)。それはフレームワークを意味します。それがCLIで実行されるのかWebサーバーで実行されるのかに制限はありません。 – apokryfos

答えて

4

Ampは非ブロッキングI/Oを使用して並行性を実現します。 PHPはhttp://php.net/stream_set_blocking経由でそれをネイティブサポートしています。

AmpはCLIアプリケーションで使用できますが、Apache内などの他のSAPIで使用して、複数のサービスに対して複数の同時要求を行うこともできます。あなたはそれ以外の場合は同期アプリケーションに非同期を埋め込みたい場合は、そのためのAmp\Promise\waitを使用することができます。

$uris = ["https://google.com/", "https://github.com/"]; 
$client = new Amp\Artax\BasicClient; 

$promises = array_map(function ($uri) use ($client) { 
    return $client->request($uri); 
}, $uris) 

$responses = Amp\Promise\wait(Amp\Promise\all($promises)); 

アンプは通常、シングルスレッドです。 amphp/parallelのようなものを使用するのは、マルチスレッドのみです。 amphp/parallelは、pthreadsまたは複数のプロセスを使用して、複数のブロッキング処理を並行して実行できます。

さらに詳しい質問がある場合は、質問とコメントを編集してください。私はそれらに回答しようとします。


は、バックグラウンド処理については、はい、それはamphp/parallelで可能ですが、元のプロセスは、そのために生き続けるために持っています。あなたはおそらく、amphp/processdisown機構を実装して、親が死んだ場合にプロセスを実行しておき、ApacheまたはPHP-FPMの内部でも動作させることができます。

しかし、キューでは失敗したタスク(ワーカーがクラッシュした場合)を再開することができ、多くのバックグラウンドジョブがあると非常に負荷が高くならないため、このようなタスクのキューをお勧めします。それらのすべてがすぐに開始されるわけではなく、代わりに従業員が時間を過ごすときにバックグラウンドで処理されます。

+0

ありがとう。 stream_set_blockingのもののupvote。私はそれについての知識がないので、あなたの答えを受け入れる前にそれを理解するためにしばらく時間をとる必要があります。 btw、私は背景のスレッドに関する質問をアンプを使用して追加しました –

+0

私はちょうど同様にそれをカバーする答えを拡張しました。その点でドキュメントを改善する方法があれば、GitHubに関する問題を開いてください:https://github.com/amphp/amp – kelunik

関連する問題