非同期パフォーマンスを最大化: ノンブロッキング I/O の ReactPHP イベント ループを介して Guzzle 7 のパワーを最大限に引き出します。
P粉043566314
P粉043566314 2024-02-17 14:29:49
0
1
493

DiscordPHP ボットを使用しており、Cookie を必要とする Web ページをダウンロードしようとしています。 ReactPHP httpブラウザはCookieをサポートしていないため、Guzzleでcurlハンドラを使用する必要があるようです。

私は次の最小限のスクリプトを作成しました:

リーリー

これは、ハングをチェックするために addPeriodicTimer を追加したり、手動で tick() を呼び出したりすることなく、すぐに終了します。 リーリー

タイマーを使用すると、期待どおりに動作します:

リーリー

tick() を使用するというアイデアは、github.com のこの 73 コメントのクローズド スレッドから生まれました。

同様の質問がいくつかありますが、この問題を解決できるものはないようです:

    非同期リクエストに Guzzle 7 プロキシを使用する、Guzzle を使用して応答を待たずに非同期リクエストを送信する、Guzzle Promise の代わりに Guzzle プールを使用する、複数のリクエストを一度に送信する方法 ReactPHP?すべてを使用する
  • wait() これはブロッキング呼び出しです。
  • ReactPHP は
  • sleep() 呼び出しを使用して同期実行を約束しますが、ReactPHP は本当に非同期ですか?長い for ループを実行します。どちらもループをブロックします。
  • 並列リクエストの場合、Guzzle、ReactPHP と Amphp、および Guzzle と React Promise では、古いバージョンの Guzzle または Guzzle 7 では正しく動作しない非推奨のコードを使用して無限ループが発生する可能性があります。

Cookie jar を使用して HTTP GET を開始し、ブロッキング呼び出し (->wait() や手動で tick()curl ハンドラーを実行しますか?

P粉043566314
P粉043566314

全員に返信(1)
P粉384366923

さて、ReactPHP は Cookie を自動的に設定しません。このトピックについて議論するチケットがすでに存在します: https://github.com/reactphp/http/issues/445 しかし、手動で設定することもできます。 HTTP Cookie ヘッダー。

Guzzle が ReactPHP のイベント ループをブロックするため、Guzzle で ReactPHP を使用すると機能しないことにも言及する価値があります。これは、複数のリクエストを送信できるが、それ以外のことを非同期的に行うことはできないことを意味します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!