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は、イベントループを考慮したコンポーネントライブラリです。簡単な例を見てみましょう:
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には同様のイベントループ実装がありますが、興味深いジェネレーターコンテンツはすべてありません。
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のオファーのすべての機能と競合するために、まだ長い道のりがあります。しかし、開発者は良い進歩を遂げています!結論
PHPコミュニティは、このアーキテクチャを理解する必要があります。非同期および並列実行を学び、実験する必要があります。 「ほとんどのシステムリソースを効果的に使用する方法」になるまで、これらの概念とベストプラクティスを何年もの間、イベントループを持っていました。
今後のつららのより実用的な実装にご期待ください!
PHPイベントループFAQ
イベントループと従来のPHPプログラミングの違いはどうですか?
PHPアプリケーションにイベントループを実装する方法は?
PHPアプリケーションにイベントループを実装するには、ReactPHPやAMPなどのこの機能を提供するライブラリを使用することが含まれます。これらのライブラリは、イベントループを作成および管理するために必要なインターフェイスとクラスを提供します。このイベントループを使用して、アプリケーションの非同期タスクを処理できます。PHPでイベントループを使用すると、アプリケーションのパフォーマンスと応答性が大幅に向上する可能性があります。これにより、複数のタスクを同時に処理することができます。これにより、リソースの活用と応答時間の短縮につながる可能性があります。これは、チャットサーバーやリアルタイムデータフィードなど、多数の同時接続を処理する必要があるアプリケーションで特に有利です。
イベントループはパフォーマンスの大きな利点を提供できますが、アプリケーションの複雑さを高めることもできます。さまざまなプログラミングスタイルが必要であり、コードの理解とデバッグをより困難にする可能性があります。さらに、すべてのタスクが非同期処理に適しているわけではなく、いくつかのタスクはイベントループで実装するのがより困難な場合があります。
はい、イベントループは、LaravelやSymfonyなどのPHPフレームワークで使用できますが、これには追加の構成が必要になる場合があります。どちらのフレームワークも同期PHPコードを使用するように設計されていますが、イベントループを使用して非同期タスクを処理するように適合させることができます。
PHP CLIスクリプトでイベントループを使用できますか?
イベントループはPHPのゴミコレクションでどのように機能しますか?
PHPの内蔵サーバーでイベントループを使用できますか?
以上がPHPでのイベントループの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。