Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie den PHP-Generator

So verwenden Sie den PHP-Generator

小云云
小云云Original
2018-03-26 09:50:501596Durchsuche

Wenn wir einen Datensatz iterieren, müssen wir im Allgemeinen Daten erstellen. Wenn das Array sehr groß ist, wird es viel Leistung verbrauchen und sogar dazu führen, dass nicht genügend Speicher vorhanden ist, um einen Fehler auszulösen
Zum Beispiel:

//Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in D:\php\test\index.php on line 5range(1, 100000000);

PHP5.5 führt das Konzept des Iterationsgenerators in PHP ein, aber der Iterationsgenerator ist eine neue Funktion von PHP. Dies ähnelt dem Iterationsgenerator in Python3 Schauen Sie sich die Iteration von PHP5.5 an, wie Generatoren definiert werden.
Im folgenden Beispiel wird ein Generator implementiert, das Schlüsselwort yield wird verwendet, um es zurückzugeben, und die Ausführungsfunktion wird angehalten. Wenn die nächste Methode der Funktion ausgeführt wird, wird die Ausführung an der zuletzt zurückgegebenen Position fortgesetzt. Wie im folgenden Beispiel werden nur Zwischenvariablen $i

function xrange($start, $limit, $step = 1) {    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
} 
foreach (xrange(1, 9, 1) as $number) {    echo "$number ";
}

generiert. Hier handelt es sich um eine Iteration, und ihre Funktion ist dieselbe wie bei Verwendung der Bereichsfunktion, der internen Implementierung Die Funktion speichert den Zwischenprozess jeder Iteration. Das heißt, jede Zwischenvariable verfügt über einen Speicherplatz. Daher ist der vom Programm verwendete Speicherplatz zunächst groß und die Zuweisung von Speicher und die Wiederverwendung von Speicher verlängern die Laufzeit das Programm. Wenn Sie jedoch die von yield implementierte xrange-Funktion verwenden, belegen alle darin enthaltenen Zwischenvariablen nur einen Speicher $i, sodass weniger Zeit und Platz eingespart werden.

Warum hat der Ertrag einen solchen Effekt? Wenn man an den Ertrag in Lua denkt, ist hier das Konzept der Coroutine. Wenn das Programm in der Lua-Sprache die Ausbeute erreicht, wird eine Coroutine verwendet, um die Kontextumgebung aufzuzeichnen, und dann werden die Programmbetriebsrechte an die Hauptfunktion zurückgegeben. Wenn die Hauptfunktionsaufrufe fortgesetzt werden, wird die Coroutine erneut aktiviert Der Ertragsdatensatz wird im Kontext gelesen. Dies bildet Multi-Coroutine-Operationen auf Programmiersprachenebene. Das Gleiche gilt für yield hier in PHP 5.5. Wenn das Programm ausgeführt wird, um yield aufzuzeichnen, ruft das aktuelle Programm die Coroutine auf, um den Kontext aufzuzeichnen, und die Hauptfunktion wird dann weiter ausgeführt. Schlüsselwörter wie „resume“ werden jedoch in PHP nicht verwendet. aber „using“ Wenn die Coroutine aufgerufen wird. Beispielsweise kann der foreach-Iterator im obigen Beispiel yield hervorrufen. Das obige Beispiel kann also verstanden werden.

Ein weiteres Beispiel:

function xrange($start, $end, $step = 1) {    for ($i = $start; $i <= $end; $i += $step) {
      yield $i;
    }
}foreach (xrange(1, 1000000) as $num) {    echo $num, "\n";
}

Beachten Sie das Schlüsselwort: yield. Es ist dieses yeild-Schlüsselwort, das einen Iterator erstellt. Dies ist der Unterschied zwischen dieser Funktion xrange und den vorherigen Funktionen. Im Allgemeinen wird ein Wert zurückgegeben, und der Wert yield bedeutet, dass dieser Iterator diesen Wert bei jeder Schleife generiert. Daher wird er als iterativer Generator bezeichnet. Die iterative Generatorfunktion kann jedes Mal eine foreach-Schleife ausführen ein Wert.

Vor PHP5.5 wurden Iteratoren durch die Definition von Klassen zur Implementierung der Iterator-Schnittstelle erstellt. Durch die Erstellung von Iteratoren über yield wird die Leistung weiter verbessert und Systemaufwand gespart.

Die Vorteile dieser Methode liegen auf der Hand. Sie ermöglicht die Verarbeitung großer Datensammlungen, ohne sie auf einmal in den Speicher zu laden, und Sie können sogar unendlich große Datenströme verarbeiten.

Wie im obigen Beispiel gezeigt, besteht die Funktion dieses Iterators darin, Zahlen von 1 bis 1000000 zu generieren und sie in einer Schleife auszugeben, wenn Sie die vorherige Methode verwenden, um die Zahlen von 1 bis 1000000 in ein Array zu generieren , es wird sehr viel Speicher beanspruchen, da alle Ergebnisse im Voraus generiert werden und nicht bei Bedarf, wenn sie verwendet werden. Das heißt, wenn der xrange-Iterator aufgerufen wird, werden die darin enthaltenen Funktionen erst bei jeder Iteration tatsächlich ausgeführt.

Verwandte Empfehlungen:

So verwenden Sie den PHP-Generator

Detaillierte Erläuterung der Funktionen und Verwendung des PHP-Generators

Detaillierte Einführung in den PHP-Generator

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den PHP-Generator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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