ホームページ > バックエンド開発 > PHPチュートリアル > PHPでのイベントループの紹介

PHPでのイベントループの紹介

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-02-17 10:37:09
オリジナル
527 人が閲覧しました

PHPイベントループ:非同期プログラミングのための武器

コアポイント

  • PHPイベントループは、特に非同期操作を処理するために、スケジューラ内のイベントやメッセージを待つために使用されるプログラミング構造です。
  • 従来のPHPプログラミングは同期しており、一度に1つの操作を実行し、次の操作を続行する前に各操作が完了するのを待っています。イベントループでは非同期プログラミングが可能になりますが、そこでは操作を開始し、結果が準備が整うまで保留にすることができますが、この期間中に他の操作を実行できます。
  • ReactPHPやAMPなどのライブラリは、PHPイベントループを作成および管理するために必要なインターフェイスとクラスを提供し、特に多数の同時接続を処理する必要があるアプリケーションで、リソースとより短い応答時間の使用を改善できるようにします。
  • イベントループは大きなパフォーマンスの利点を提供できますが、アプリケーションの複雑さを高め、異なるプログラミングスタイルを必要とし、コードをより困難にしてデバッグすることもできます。すべてのタスクが非同期処理に適しているわけではなく、一部のタスクはイベントループで実装するのがより困難な場合があります。
PHP開発者は常に何かを待っています。リモートサービスのリクエストを待つこともあります。データベースが複雑なクエリから行を返すのを待つことがあります。すべての待機期間中に他の操作を行うことができれば、それは素晴らしいことではないでしょうか?

JSコードを書いた場合、コールバックとDOMイベントに精通している可能性があります。 PHPにはコールバックもありますが、それらはまったく同じように機能しません。これは、イベントループと呼ばれる機能のおかげです。

イベントループの仕組みと、PHPでイベントループを使用する方法を理解します。 An Introduction into Event Loops in PHP

興味深い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ズーム変換をサポートするブラウザで動作します。最新のChromeバージョンで十分です。 CSSセレクターがドキュメント内の要素と一致することを確認してください。

これらの関数は、CSSセレクターと中心を受信し、画面に合わせて要素を拡張します。 forループにエラーをスローするとどうなりますか?このようなものが見えます...

An Introduction into Event Loops in PHP この関数リストスタックトレースと呼びます。これは、ブラウザが使用するスタックの内側がどのように見えるかです。彼らはこのコードを手順で処理します...

An Introduction into Event Loops in PHP

これは、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");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
2番目のConsole.logは、SettimeOutの内部からConsole.logが開始される前に行われます。標準のPHPのSettimeOutのようなものはありませんが、シミュレートしようとする必要がある場合:

実行すると、タイムアウトの内側、タイムアウトの外側が表示されます。これは、遅延後にコールバックを実行するためにSettimeOut関数で無限ループを使用する必要があるためです。

setTimeout(function() {
    console.log("inside the timeout");
}, 1);

console.log("outside the timeout");
ログイン後にコピー
SettimeOutの外側にループしている間に移動し、すべてのコードを含めるのは魅力的です。これにより、コードのブロックが少なくなる可能性がありますが、ある時点でそのループによって常にブロックされます。ある時点で、一度に1つのスレッドで1つしかできないことがわかります。

標準の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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート