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)

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile
