PHPでのイベントループの紹介
PHPイベントループ:非同期プログラミングのための武器
コアポイント
- PHPイベントループは、特に非同期操作を処理するために、スケジューラ内のイベントやメッセージを待つために使用されるプログラミング構造です。
- 従来のPHPプログラミングは同期しており、一度に1つの操作を実行し、次の操作を続行する前に各操作が完了するのを待っています。イベントループでは非同期プログラミングが可能になりますが、そこでは操作を開始し、結果が準備が整うまで保留にすることができますが、この期間中に他の操作を実行できます。 ReactPHPやAMPなどのライブラリは、PHPイベントループを作成および管理するために必要なインターフェイスとクラスを提供し、特に多数の同時接続を処理する必要があるアプリケーションで、リソースとより短い応答時間の使用を改善できるようにします。
- イベントループは大きなパフォーマンスの利点を提供できますが、アプリケーションの複雑さを高め、異なるプログラミングスタイルを必要とし、コードをより困難にしてデバッグすることもできます。すべてのタスクが非同期処理に適しているわけではなく、一部のタスクはイベントループで実装するのがより困難な場合があります。
JSコードを書いた場合、コールバックとDOMイベントに精通している可能性があります。 PHPにはコールバックもありますが、それらはまったく同じように機能しません。これは、イベントループと呼ばれる機能のおかげです。
イベントループの仕組みと、PHPでイベントループを使用する方法を理解します。
待機場所
イベントループを理解するには、ブラウザでどのように機能するかを見てみましょう。この例をご覧ください:
function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");
これらの関数は、CSSセレクターと中心を受信し、画面に合わせて要素を拡張します。 forループにエラーをスローするとどうなりますか?このようなものが見えます...
この関数リストスタックトレースと呼びます。これは、ブラウザが使用するスタックの内側がどのように見えるかです。彼らはこのコードを手順で処理します...
これは、PHPがスタックを使用してコンテキストを保存する方法のようなものです。ブラウザはさらに一歩進んで、DOMイベントやAJAXコールバックなどのコンテンツにWebAPIを提供します。その自然状態では、JavaScriptはPHPとして非同期です。つまり、どちらも同時に多くの操作を実行できるように見えますが、どちらもシングルスレッドです。彼らは一度に1つしかできません。
イベントのないlife JSでは、次のコードを実行できます
このコードを実行すると、コンソール内のタイムアウトの外に、次にタイムアウト内に表示されます。 SettimeOut関数は、ブラウザが提供するWebAPIの一部です。 1ミリ秒が経過した後、コールバックキューにコールバックを追加します。
function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");
実行すると、タイムアウトの内側、タイムアウトの外側が表示されます。これは、遅延後にコールバックを実行するためにSettimeOut関数で無限ループを使用する必要があるためです。
setTimeout(function() { console.log("inside the timeout"); }, 1); console.log("outside the timeout");
標準のPHPにはSettimeOutのようなものはありませんが、イベントループと並行して非ブロックコードを実装する曖昧な方法があります。 Stream_Selectなどの関数を使用して、非ブロッキングネットワークiOSを作成できます。 EIOなどのC拡張機能を使用して、非ブロッキングファイルシステムコードを作成できます。これらのあいまいな方法に基づいて構築されたライブラリを見てみましょう...
icicle
iticleは、イベントループを考慮したコンポーネントライブラリです。簡単な例を見てみましょう:
これは、iCicleio/iciclerバージョン0.8.0
function setTimeout(callable $callback, $delay) { $now = microtime(true); while (true) { if (microtime(true) - $now > $delay) { $callback(); return; } } } setTimeout(function() { print "inside the timeout"; }, 1); print "outside the timeout";
を使用しています ICICLEのイベントループの実装は素晴らしいです。また、約束、ソケット、サーバーの実装など、他にも多くの印象的な機能があります。
icicleは、コルーチンとしてジェネレーターも使用します。ジェネレーターとコルーチンは別のトピックですが、許可するコードは美しいです:これは、ICICLEIO/DNSバージョン0.5.0
use Icicle\Loop; Loop\timer(0.1, function() { print "inside timer"; }); print "outside timer"; Loop\run();
Reactphp
Reactphpには同様のイベントループ実装がありますが、興味深いジェネレーターコンテンツはすべてありません。
function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");
これは、React/Event-Loopバージョン0.4.1 を使用しています
Reactphpは、つららよりも成熟しており、より広い範囲のコンポーネントがあります。 Icicleには、ReactPhpのオファーのすべての機能と競合するために、まだ長い道のりがあります。しかし、開発者は良い進歩を遂げています!結論
私たちが持っていると教えられた単一のスレッドの考え方を取り除くことは困難です。非ブロックAPIおよびイベントループにアクセスできる場合、どれだけのコードを書くことができるかわかりません。
PHPコミュニティは、このアーキテクチャを理解する必要があります。非同期および並列実行を学び、実験する必要があります。 「ほとんどのシステムリソースを効果的に使用する方法」になるまで、これらの概念とベストプラクティスを何年もの間、イベントループを持っていました。
今後のつららのより実用的な実装にご期待ください!
PHPイベントループFAQ
PHPでのイベントループの役割は何ですか?
PHPのイベントループは、スケジューラ内のイベントやメッセージを待つために使用されるプログラミング構造です。それは、外部刺激に応じてすべてのアクティブなイベントを追跡し、それらが終了したときにそれらをスケジュールすることで機能します。これは、非同期操作を処理するためのPHPで特に役立ちます。ここでは、操作を開始し、操作が完了するのを待たずに処理を続けます。
イベントループと従来のPHPプログラミングの違いはどうですか?
従来のPHPプログラミングは同期です。つまり、一度に1つの操作を実行し、書かれた順序で実行し、次の操作を続行する前に各操作が完了するのを待つ必要があります。一方、イベントループにより、非同期プログラミングが可能になります。これは、アクションを開始してから、結果が準備されるまで保留し、その間に他のアクションを実行できることを意味します。
PHPアプリケーションにイベントループを実装する方法は?
PHPアプリケーションにイベントループを実装するには、ReactPHPやAMPなどのこの機能を提供するライブラリを使用することが含まれます。これらのライブラリは、イベントループを作成および管理するために必要なインターフェイスとクラスを提供します。このイベントループを使用して、アプリケーションの非同期タスクを処理できます。PHPイベントループを使用することの利点は何ですか?
PHPでイベントループを使用すると、アプリケーションのパフォーマンスと応答性が大幅に向上する可能性があります。これにより、複数のタスクを同時に処理することができます。これにより、リソースの活用と応答時間の短縮につながる可能性があります。これは、チャットサーバーやリアルタイムデータフィードなど、多数の同時接続を処理する必要があるアプリケーションで特に有利です。
PHPイベントループを使用することの欠点は何ですか?
イベントループはパフォーマンスの大きな利点を提供できますが、アプリケーションの複雑さを高めることもできます。さまざまなプログラミングスタイルが必要であり、コードの理解とデバッグをより困難にする可能性があります。さらに、すべてのタスクが非同期処理に適しているわけではなく、いくつかのタスクはイベントループで実装するのがより困難な場合があります。
LaravelやSymfonyなどのPHPフレームワークを使用してイベントループを使用できますか?
はい、イベントループは、LaravelやSymfonyなどのPHPフレームワークで使用できますが、これには追加の構成が必要になる場合があります。どちらのフレームワークも同期PHPコードを使用するように設計されていますが、イベントループを使用して非同期タスクを処理するように適合させることができます。
イベントループでエラーを処理する方法は?
イベントループでのエラー処理は、同期されたPHPコードでのエラー処理よりも複雑な場合があります。タスクは非同期に実行されるため、エラーはすぐにキャッチされない場合があります。代わりに、エラーが発生したときに呼び出されるコールバック関数を提供する必要があります。PHP CLIスクリプトでイベントループを使用できますか?
はい、PHP CLI(コマンドラインインターフェイス)スクリプトでイベントループを使用できます。実際、CLIスクリプトでは複数のタスクを同時に実行する必要があるため、これはイベントループの一般的なユースケースです。
イベントループはPHPのゴミコレクションでどのように機能しますか?
PHPのゴミコレクションは、イベントループとは無関係に機能します。ただし、イベントループはすべてのアクティブなタスクへの参照を保持しているため、これらのタスクは完了後にのみ収集されます。これは、イベントループコードのメモリリークを避けるように注意する必要があることを意味します。
PHPの内蔵サーバーでイベントループを使用できますか?
はい、PHPの内蔵サーバーを備えたイベントループを使用できます。ただし、組み込みサーバーは生産目的で設計されておらず、専用のWebサーバーと同じレベルのパフォーマンスや信頼性を提供しない場合があることを忘れないでください。
以上がPHPでのイベントループの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LaravelのバックエンドでReactアプリを構築する:パート2、React
