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.
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");
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 ...
wir nennen diese Funktionsliste Stack Trace. So sieht das Innere des Stapels des Browsers aus. Sie werden diesen Code in Schritten verarbeiten ...
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");
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");
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";
Dies verwendet ICiciceio/ICicle Version 0.8.0
Die Implementierung der Ereignisschleife vonICicle 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();
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");
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 vonPHP 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!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

TosecurelyHandleAuthenticationAuthorizationInphp, folge theSteps: 1.Alwayshashpasswordswithpassword_hash () und password_verify (), usePreeParedStatementStopreventsQlinjapitca und StoreuserDatain $ _SessionArtelogin.2.ImplementscaChescescesc

Um Datei -Uploads in PHP sicher zu verarbeiten, besteht der Kern darin, Dateitypen zu überprüfen, Dateien umzubenennen und die Berechtigungen zu beschr?nken. 1. Verwenden Sie Finfo_File (), um den realen MIME -Typ zu überprüfen, und nur bestimmte Typen wie Bild/JPEG sind zul?ssig. 2. Verwenden Sie Uniqid (), um zuf?llige Dateinamen zu generieren und sie im Root-Verzeichnis ohne Web zu speichern. 3.. Begrenzen Sie die Dateigr??e durch Php.ini- und HTML -Formulare und setzen Sie die Verzeichnisberechtigungen auf 0755; 4. Verwenden Sie Clamav, um Malware zu scannen, um die Sicherheit zu verbessern. Diese Schritte verhindern effektiv Sicherheitslücken und stellen sicher, dass der Upload -Prozess des Datei -Uploads sicher und zuverl?ssig ist.

In PHP ist der Hauptunterschied zwischen == und == die Strenge der Typprüfung. == Die Konvertierung des Typs wird vor dem Vergleich durchgeführt, beispielsweise 5 == "5" gibt true zurück und === fordert an, dass der Wert und der Typ gleich sind, bevor True zurückgegeben wird, z. B. 5 === "5" gibt false zurück. In den Nutzungsszenarien ist === sicherer und sollte zuerst verwendet werden, und == wird nur verwendet, wenn die Typumwandlung erforderlich ist.

Die Methoden zur Verwendung grundlegender mathematischer Operationen in PHP sind wie folgt: 1. Additionszeichen unterstützen Ganzfaktoren und Floating-Punkt-Zahlen und k?nnen auch für Variablen verwendet werden. String -Nummern werden automatisch konvertiert, aber nicht für Abh?ngigkeiten empfohlen. 2. Subtraktionszeichen verwenden - Zeichen, Variablen sind gleich, und die Typumwandlung ist ebenfalls anwendbar. 3. Multiplikationszeichen verwenden * Zeichen, die für Zahlen und ?hnliche Zeichenfolgen geeignet sind; 4. Division verwendet / Zeichen, die vermeiden müssen, durch Null zu dividieren, und beachten Sie, dass das Ergebnis m?glicherweise schwimmende Punktzahlen sein kann. 5. Die Modulzeichen k?nnen verwendet werden, um ungerade und sogar Zahlen zu beurteilen, und wenn negative Zahlen verarbeitet werden, stimmen die Restzeichen mit der Dividende überein. Der Schlüssel zur korrekten Verwendung dieser Operatoren liegt darin, sicherzustellen, dass die Datentypen klar sind und die Grenzsituation gut behandelt wird.

Ja, PHP kann mit NoSQL -Datenbanken wie MongoDB und Redis durch bestimmte Erweiterungen oder Bibliotheken interagieren. Verwenden Sie zun?chst den MongoDBPHP -Treiber (installiert über PECL oder Composer), um Client -Instanzen zu erstellen und Datenbanken und Sammlungen zu betreiben, wobei Sie Insertion, Abfrage, Aggregation und andere Vorg?nge unterstützen. Zweitens verwenden Sie die Predis Library oder PHPREDIS-Erweiterung, um eine Verbindung zu Redis herzustellen, Schlüsselwerteinstellungen und -akquisitionen durchzuführen und PHPREDIS für Hochleistungsszenarien zu empfehlen, w?hrend Predis für die schnelle Bereitstellung bequem ist. Beide sind für Produktionsumgebungen geeignet und gut dokumentiert.

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

PHPBECAMEPOPULARFORWebDevelopmentDuetoitSeaseoflearning, Seamlessintegrationwithhtml, weit verbreitete Hostingsupport, andalargeecosystemincludingFrameWorkelaravelandcmsplatformen -?hnliche WordPress.itexcelsinformlingsformen, Managingusesersions, Interacti

Tosettherighttimezoneinphp, usedate_default_timezone_set () functionAtthestartofyourScriptWithAvalididentifiersuchas'america/new_york'.1.usedate_default_timezone_set () beeanydate/timeFununtions.2.Alternativ, konfigurieren
