Beim Autofahren ist Geschwindigkeit nicht alles. Aber im Internet macht die Geschwindigkeit den entscheidenden Unterschied. Je schneller Ihre Anwendung ist, desto besser ist das Benutzererlebnis. In diesem Artikel geht es um PHP-Generatoren. Warum sprechen wir also über Geschwindigkeit? Sie werden schnell feststellen, dass Generatoren eine große Rolle bei der Geschwindigkeits- und Speicherverwaltung spielen.
Was ist PHP Generator?
Generatoren wurden in PHP 5.5 hinzugefügt und bieten eine einfache Möglichkeit, Daten zu iterieren, ohne Arrays im Speicher zu erstellen. Sind Sie etwas verwirrt? Geben Sie dann ein Beispiel, um zu zeigen, dass die Verwendung von Generatoren eine gute Möglichkeit ist.
Erstellen Sie zunächst eine Datei „generator.php“, die in unserem Beispiel verwendet wird. Nachdem wir die Datei erstellt haben, fügen wir einen Code hinzu.
<?php function getRange ($max = 10) { $array = []; for ($i = 1; $i < $max; $i++) { $array[] = $i; } return $array; } foreach (getRange(15) as $range) { echo "Dataset {$range} <br>"; }
Wir können schnell einen integrierten PHP-Server in dem Verzeichnis starten, in dem die Datei generator.php erstellt wird:
php -S localhost:8000
Wenn Sie http://localhost:8000/generator.php öffnen Mit einem Browser sollten wir Ergebnisse wie diese sehen:
Dieser Code ist nicht sehr selbsterklärend. Ändern wir den Code ein wenig
<?php foreach (getRange(PHP_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }
Der maximale Wert, den der obige Code generieren kann, ist nun PHP_INT_MAX (d. h. der maximale Wert, den PHP nach dieser Änderung generieren kann). Beachten Sie, dass dieses Mal etwas anders ist. Dieses Generatorskript gibt eine Warnmeldung aus.
Es ist eine Schande, dass PHP nicht mehr über genügend Speicher verfügt. Zu den Lösungen, die Sie sich vorstellen können, gehört möglicherweise die Erhöhung der Obergrenze von „memory_limit“ in der Datei „php.ini“. Aber fairerweise muss man sagen, dass dieses Skript sowohl ineffizient ist als auch Speicher beansprucht. Was wir brauchen, ist ein Skript, das effizient ist und wenig Speicher beansprucht.
Generatoren verwenden
Definieren wir die gleiche Funktion oben, rufen sie mit dem gleichen Wert von PHP_INT_MAX auf und führen sie erneut aus. Aber dieses Mal erstellen wir eine Generatorfunktion.
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { yield $i; } } foreach (getRange(PHP_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }
Beim Parsen der getRange-Funktion durchlaufen wir dieses Mal einfach die Werte und liefern die Ausgabe. yield ähnelt return value darin, dass es auch einen Wert von einer Funktion zurückgibt, der einzige Unterschied besteht jedoch darin, dass yield nur bei Bedarf einen Wert zurückgibt und nicht versucht, den gesamten Datensatz im Speicher zu behalten.
Wenn Sie Ihren Browser aufrufen, sollten die auf der Seite angezeigten Daten angezeigt werden. Bei entsprechender Zeit zeigt der Browser schließlich die Daten an.
Hinweis: Generatoren können nur innerhalb von Funktionen verwendet werden.
Warum Generatoren verwenden
Manchmal kann es vorkommen, dass wir einen großen Datensatz (vielleicht eine Protokolldatei) analysieren möchten. Das ist auch der Fall Es ist möglich, Berechnungen auf der Ergebnismenge einer großen Datenbank usw. durchzuführen. Wir möchten nicht, dass alle diese Daten in den Speicher geladen werden. Wir sollten den entsprechenden Speicherstatus so weit wie möglich speichern. Die Daten müssen nicht groß sein – der Generator ist effizient, egal wie klein die Daten sind. Vergessen Sie nicht: Unser Ziel ist es, weniger Speicher zu verbrauchen, um Daten so schnell wie möglich zu verarbeiten.
Schlüssel-Wert-Paare zurückgeben
Manchmal sind unsere Daten überzeugender, wenn sie auf Schlüsselwerten basieren. Wenn wir einen Generator verwenden, können wir Schlüssel-Wert-Paare wie die folgenden generieren.
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $value = $i * mt_rand(); yield $i => $value; } }
Wir können dieses Schlüssel-Wert-Paar dann wie jedes Array verwenden.
<?php foreach (getRange(PHP_INT_MAX) as $range => $value) { echo "Dataset {$range} has {$value} value<br>"; }
Parameter an den Generator übergeben
Der Generator kann auch Parameter empfangen. Das bedeutet, dass der Generator es uns ermöglicht, Parameter als Befehl oder andere Funktionen einzufügen. Beispielsweise senden wir einen Wert an den Generator, um dessen Ausführung zu stoppen oder seine Ausgabe zu ändern. Mit der oben genannten getRange-Funktion können wir dies erreichen.
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $injected = yield $i; if ($injected === 'stop') return; } }
Um diesen Wert zu injizieren, können wir Folgendes tun.
<?php $generator = getRange(PHP_INT_MAX); foreach ($generator as $range) { if ($range === 10000) { $generator->send('stop'); } echo "Dataset {$range} <br>"; }
Hinweis: Die Verwendung von Return in einem Generator führt zu einem Sprung aus dem Generator.
Generatoren nicht missbrauchen
Obwohl die Verwendung von PHP_INT_MAX etwas übertrieben ist. Aber für mich ist PHP_INT_MAX 2147483647, was bedeutet:
zwei Milliarden viertausendvierhundertvierundsiebzigtausenddreiundachtzigtausendsechshundertsiebenundvierzig
Der Generator macht die Speichernutzung effizienter . Bei Missbrauch kann es jedoch auch zu Gedächtnisproblemen kommen.
Zusammenfassung
Generatoren bieten erhebliche Leistungsverbesserungen, die kaum zu ignorieren sind. In den meisten Fällen benötigen wir keinen Server mit hoher Konfiguration, um den Code auszuführen. Wir müssen nur ein wenig umgestalten, Generatoren sind sehr nützlich und wir sollten sie häufiger nutzen.
Empfohlene Tutorials: „Laravel-Tutorial“ „PHP-Tutorial“ „PHP7“
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Generators in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!