Heim > Backend-Entwicklung > PHP-Tutorial > Eine Einführung in Ereignisschleifen in PHP

Eine Einführung in Ereignisschleifen in PHP

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-02-17 10:37:09
Original
514 Leute haben es durchsucht

PHP -Ereignisschleife: Eine Waffe für asynchrones Programmieren

Kernpunkte

  • PHP -Ereignisschleife ist eine Programmierstruktur, mit der in einem Scheduler Ereignisse oder Nachrichten gewartet werden, insbesondere für die Behandlung asynchroner Vorgänge.
  • herkömmliche PHP -Programmierung ist synchron, führt jeweils eine Operation durch und wartet darauf, dass jede Operation abgeschlossen wird, bevor die nächste Operation fortgesetzt wird. Während die Ereignisschleife eine asynchrone Programmierung ermöglicht, bei der ein Vorgang gestartet und anschließend aufgehalten werden kann, bis das Ergebnis fertig ist, können während dieser Zeit andere Vorgänge ausgeführt werden.
  • Bibliotheken wie ReactPHP oder AMP bieten die erforderlichen Schnittstellen und Klassen, um PHP -Ereignisschleifen zu erstellen und zu verwalten, um eine bessere Nutzung von Ressourcen und kürzere Reaktionszeiten zu ermöglichen, insbesondere in Anwendungen, die eine große Anzahl gleichzeitiger Verbindungen verarbeiten müssen.
  • Während Ereignisschleifen erhebliche Leistungsvorteile bieten können, können sie auch die Komplexität der Anwendung erhöhen, unterschiedliche Programmierstile erfordern und den Code schwieriger zu verstehen und zu debuggen. Nicht alle Aufgaben sind für die asynchrone Verarbeitung geeignet, und einige Aufgaben sind möglicherweise schwieriger zu implementieren.

PHP -Entwickler warten immer auf etwas. Manchmal warten wir auf eine Anfrage nach Remotediensten. Manchmal warten wir darauf, dass die Datenbank Zeilen aus komplexen Abfragen zurückgibt. Wäre das nicht großartig, wenn wir während aller Wartezeiten andere Operationen ausführen könnten?

Wenn Sie einen JS -Code geschrieben haben, sind Sie möglicherweise mit Callbacks und DOM -Ereignissen vertraut. Obwohl wir auch Rückrufe in PHP haben, funktionieren sie nicht genauso. Dies ist einer Funktion namens Event Loop zu verdanken.

An Introduction into Event Loops in PHP Wir werden verstehen, wie Ereignisschleifen funktionieren und wie Ereignisschleifen in PHP verwendet werden.

Wir werden einige interessante PHP -Bibliotheken sehen. Einige Leute glauben, dass diese Bibliotheken nicht stabil genug sind, um in Produktionsumgebungen verwendet zu werden. Einige Leute glauben, dass die hier bereitgestellten Beispiele "vorzugsweise in einer ausgereifteren Sprache implementiert werden". Es gibt viele gute Gründe, diese Methoden auszuprobieren. Es gibt auch gute Gründe, diese Methoden in Produktionsumgebungen zu vermeiden. Der Zweck dieses Artikels ist es, Möglichkeiten in PHP hervorzuheben.

Warteplätze

Um Ereignisschleifen zu verstehen, lassen Sie uns sehen, wie sie im Browser funktionieren. Schauen Sie sich dieses Beispiel an:

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Dieser Code erfordert keine zusätzlichen Bibliotheken. Es funktioniert in jedem Browser, der die CSS -Zoomumwandlung unterstützt. Die neueste Chrome -Version reicht aus. Stellen Sie einfach sicher, dass der CSS -Selektor den Elementen im Dokument entspricht.

Diese Funktionen erhalten einen CSS -Selektor und einen Zentrum und skalieren die Elemente für den Bildschirm. Was passiert, wenn wir einen Fehler in die für Schleife werfen? Wir werden so etwas sehen ...

An Introduction into Event Loops in PHP

wir nennen diese Funktionsliste Stack Trace. So sieht das Innere des Stapels des Browsers aus. Sie werden diesen Code in Schritten verarbeiten ...

An Introduction into Event Loops in PHP

Dies ist so, wie PHP den Stapel verwendet, um den Kontext zu speichern. Der Browser geht noch einen Schritt weiter und bietet Webapi für Inhalte wie DOM -Ereignisse und AJAX -Rückrufe. In seinem natürlichen Zustand ist JavaScript asynchron wie PHP. Das heißt: Während beide in der Lage zu sein scheinen, viele Operationen gleichzeitig auszuführen, sind beide eines Threaden. Sie können jeweils nur eine Sache tun.

Mithilfe von Browser -Webapis wie SetTimeout und AddEventListener können wir parallele Arbeiten auf verschiedene Threads abladen. Wenn diese Ereignisse auftreten, fügt der Browser den Rückruf der Rückrufwarteschlange hinzu. Wenn der Stapel beim nächsten Mal leer ist, nimmt der Browser die Rückrufe aus der Rückrufwarteschlange auf und führt sie aus.

Dieser Prozess des Löschens des Stapels und der Anrufen der Warteschlange ist die Ereignisschleife.

Leben ohne Ereignisschleife

In JS können wir den folgenden Code ausführen:

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wenn wir diesen Code ausführen, sehen wir außerhalb der Zeitüberschreitung in der Konsole und dann innerhalb des Timeouts. Die SetTimeOut -Funktion ist Teil der vom Browser bereitgestellten Webapi. Nachdem 1 Millisekunde verstrichen ist, fügen sie den Rückruf zur Rückrufwarteschlange hinzu.

Die zweite Konsole.log erfolgt vor dem Beginn der Konsole.log. Wir haben nichts wie SetTimeout in Standard -PHP, aber wenn wir versuchen müssen, es zu simulieren:

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

console.log("outside the timeout");
Nach dem Login kopieren

Wenn wir es ausführen, sehen wir innerhalb des Auszeits und dann außerhalb der Auszeit. Dies liegt daran, dass wir in der SetTimeout -Funktion eine unendliche Schleife verwenden müssen, um den Rückruf nach einer Verzögerung auszuführen.

Es kann verlockend sein, sich während der Schleife außerhalb von SetTimeout zu bewegen und den gesamten Code einzuschließen. Dies kann dazu führen, dass sich unser Code weniger blockiert fühlt, aber irgendwann werden wir immer durch diese Schleife blockiert. Irgendwann werden wir sehen, dass wir jeweils nur eine Sache in einem Thread machen können.

Während es in Standard-PHP nichts anderes als SetTimeout gibt, gibt es dunkle Möglichkeiten, nicht blockierende Code parallel zur Ereignisschleife zu implementieren. Wir können Funktionen wie Stream_Select verwenden, um nicht blockierende Netzwerk-IOS zu erstellen. Wir können C-Erweiterungen wie EIO verwenden, um nicht blockierende Dateisystemcode zu erstellen. Schauen wir uns die Bibliothek an, die auf diesen obskuren Methoden basiert ...

icicle

ICicle ist eine Komponentenbibliothek, die Ereignisschleifen berücksichtigt. Schauen wir uns ein einfaches Beispiel an:

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";
Nach dem Login kopieren

Dies verwendet ICiciceio/ICicle Version 0.8.0

Die Implementierung der Ereignisschleife von

ICicle ist großartig. Es hat auch viele andere beeindruckende Funktionen;

ICicle verwendet auch Generatoren als Coroutinen. Generatoren und Coroutinen sind ein anderes Thema, aber der Code, den sie zulassen, ist wunderschön:

use Icicle\Loop;

Loop\timer(0.1, function() {
    print "inside timer";
});

print "outside timer";

Loop\run();
Nach dem Login kopieren

Dies verwendet den Iciciceio/DNS -Version 0.5.0 Generator, um das Schreiben von asynchronem Code ähnlich dem Synchroncode zu vereinfachen. In Kombination mit Versprechen und Eventschleifen produzieren sie einen exzellenten, nicht blockierenden Code wie diesen!

reactPhp

reactPhp hat eine ähnliche Implementierung von Ereignisschleifen, jedoch ohne den interessanten Generatorinhalt:

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Dies verwendet React/Event-Loop-Version 0.4.1

reactPHP ist reifer als Eiszapfen und hat einen breiteren Bereich von Komponenten. Icicle hat noch einen langen Weg vor sich, um mit allen Funktionen zu konkurrieren, die ReactPHP -Angebote. Entwickler machen jedoch gute Fortschritte!

Schlussfolgerung

Es ist schwierig, die Einstellung mit einem Threaden loszuwerden, für die uns beigebracht wurde. Wenn wir Zugriff auf nicht blockierende APIs und Ereignisschleifen haben, wissen wir nicht, wie viel Code wir schreiben können.

Die PHP -Community muss diese Architektur verstehen. Wir müssen mit asynchroner und paralleler Ausführung lernen und experimentieren. Wir müssen diese Konzepte und Best Practices aus anderen Sprachen stehlen, die seit Jahren Ereignisschleifen haben, bis „wie man die meisten Systemressourcen effektiv nutzt?“

Seien Sie gespannt auf eine praktischere Implementierung des kommenden Eiszapfens!

PHP Event Loop FAQ

Welche Rolle spielt Ereignisschleifen in PHP?

Ereignisschleifen in PHP sind Programmierstrukturen, die zum Warten auf Ereignisse oder Nachrichten in einem Scheduler verwendet werden. Es funktioniert, indem es jedes aktive Ereignis als Reaktion auf externe Stimuli verfolgt und sie nach Fertigstellung plant. Dies ist besonders nützlich in PHP für den Umgang mit asynchronen Operationen, bei denen Sie den Betrieb starten und dann fortsetzen möchten, ohne auf die Abschluss des Betriebs zu warten.

Wie ist der Unterschied zwischen Ereignisschleifen und herkömmlicher PHP -Programmierung?

herkömmliche PHP -Programmierung ist synchron, was bedeutet, dass sie jeweils eine Operation durchführt, in der Reihenfolge, in der es geschrieben wurde, und auf jede Operation warten muss, bevor die nächste Operation fortgesetzt wird. Auf der anderen Seite ermöglichen Ereignisschleifen eine asynchrone Programmierung. Dies bedeutet, dass die Aktion gestartet und dann in die Warteschleife gebracht werden kann, bis das Ergebnis fertig ist, in dem andere Aktionen ausgeführt werden können.

So implementieren Sie Ereignisschleifen in meiner PHP -Anwendung?

Implementieren von Ereignisschleifen in Ihrer PHP -Anwendung beinhaltet die Verwendung von Bibliotheken, die diese Funktionalität liefern, z. B. ReactPHP oder AMP. Diese Bibliotheken bieten die erforderlichen Schnittstellen und Klassen, um Ereignisschleifen zu erstellen und zu verwalten. Sie können diese Ereignisschleife dann verwenden, um asynchrone Aufgaben in Ihrer Anwendung zu erledigen.

Was sind die Vorteile der Verwendung von PHP -Ereignisschleifen?

Die Verwendung von Ereignisschleifen in PHP kann die Anwendungsleistung und die Reaktionsfähigkeit erheblich verbessern. Sie können mehrere Aufgaben gleichzeitig und nicht nacheinander bearbeiten, was dazu führen kann, dass die Ressourcen und kürzere Reaktionszeiten besser verwendet werden. Dies ist insbesondere bei Anwendungen vorteilhaft, bei denen eine große Anzahl gleichzeitiger Verbindungen wie Chat-Server oder Echtzeitdatenfeeds behandelt werden müssen.

Was sind die Nachteile der Verwendung von PHP -Ereignisschleifen?

Während Ereignisschleifen erhebliche Leistungsvorteile bieten können, können sie auch die Komplexität der Anwendung erhöhen. Sie erfordern unterschiedliche Programmierstile und können den Code schwieriger verstehen und debuggen. Darüber hinaus sind nicht alle Aufgaben für die asynchrone Verarbeitung geeignet, und einige Aufgaben sind möglicherweise schwieriger in Ereignisschleifen zu implementieren.

Kann ich Ereignisschleifen mit PHP -Frameworks wie Laravel oder Symfony verwenden?

Ja, Ereignisschleifen können mit PHP -Frameworks wie Laravel oder Symfony verwendet werden, obwohl dies möglicherweise eine zusätzliche Konfiguration erfordert. Beide Frameworks sind so konzipiert, dass sie mit synchronem PHP -Code arbeiten, können jedoch so angepasst werden, dass sie mit Ereignisschleifen arbeiten, um asynchrone Aufgaben zu erledigen.

Wie kann ich in der Ereignisschleife Fehler umgehen?

Fehlerbehandlung in Ereignisschleifen kann komplizierter sein als die Fehlerbehandlung im synchronisierten PHP -Code. Da die Aufgabe asynchron ausgeführt wird, wird der Fehler möglicherweise nicht sofort gefangen. Stattdessen müssen Sie normalerweise eine Rückruffunktion bereitstellen, die aufgerufen wird, wenn ein Fehler auftritt.

Kann ich Ereignisschleifen in PHP -CLI -Skripten verwenden?

Ja, Sie können Ereignisschleifen in Skripten PHP CLI (Befehlszeilenschnittstellen) verwenden. In der Tat ist dies ein häufiger Anwendungsfall für Ereignisschleifen, da CLI -Skripte häufig mehrere Aufgaben gleichzeitig ausgeführt werden müssen.

Wie funktioniert Event Loop mit der Müllsammlung von PHP?

Die Müllsammlung von

PHP funktioniert unabhängig von Veranstaltungsschleifen. Da die Ereignisschleife jedoch Verweise auf alle aktiven Aufgaben behält, werden diese Aufgaben erst nach Fertigstellung Müll erfasst. Dies bedeutet, dass Sie vorsichtig sein müssen, um Speicherlecks im Ereignisschleifcode zu vermeiden.

Kann ich Ereignisschleifen mit einem integrierten Server von PHP verwenden?

Ja, Sie können Ereignisschleifen mit dem integrierten Server von PHP verwenden. Denken Sie jedoch daran, dass ein integrierter Server nicht für Produktionszwecke ausgelegt ist und möglicherweise nicht die gleiche Leistung oder Zuverlässigkeit wie ein dedizierter Webserver bietet.

Das obige ist der detaillierte Inhalt vonEine Einführung in Ereignisschleifen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage