Inhaltsverzeichnis
Vorteile
die
概念理解
实际开发应用
读取超大文件
Heim Backend-Entwicklung PHP-Tutorial Ein übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren

Ein übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren

Dec 08, 2017 pm 01:58 PM
php 利器

In diesem Artikel teilen wir mit Ihnen das Wissen über Generatoren, ein vernachlässigtes Leistungsoptimierungstool in PHP. Wir hoffen, dass es allen helfen kann. Wenn Sie mit Python oder anderen Sprachen arbeiten, sollten Sie mit Generatoren vertraut sein. Viele PHP-Entwickler kennen die Generatorfunktion jedoch möglicherweise nicht. Dies kann daran liegen, dass der Generator eine in PHP 5.5.0 eingeführte Funktion ist oder die Funktion des Generators nicht sehr offensichtlich ist. Allerdings ist die Generatorfunktion wirklich nützlich.

Vorteile

Wenn ich direkt über das Konzept spreche, werden Sie vermutlich immer noch verwirrt sein, nachdem Sie es sich angehört haben. Sprechen wir also zuerst über die Vorteile, vielleicht kann es Ihr Interesse wecken. Was sind also die Vorteile von Generatoren? Läufe Sparen Sie viel Speicher

  • Eher geeignet für die Berechnung großer Datenmengen

  • Wie werden diese magischen Funktionen erreicht? Lassen Sie uns zunächst ein Beispiel geben.

  • Konzepteinführung
  • Lassen Sie uns zunächst die Last des Generatorkonzepts niederlegen und uns eine einfache PHP-Funktion ansehen:

Dies ist ein sehr verbreitetes PHP Funktion, wir Es wird häufig beim Umgang mit einigen Arrays verwendet. Auch hier ist der Code sehr einfach:

Wir erstellen eine Funktion. Die

function createRange($number){
    $data = [];
    for($i=0;$i<$number;$i++){
        $data[] = time();
    }
    return $data;
}
Nach dem Login kopieren

-Funktion enthält eine

-Schleife, und wir schleifen die aktuelle Zeit in
  1. -Schleifenausführung, wenn Sie fertig sind , zurück

    . for$data

  2. Es ist noch nicht vorbei, lasst uns weitermachen. Schreiben wir eine weitere Funktion und geben den Rückgabewert dieser Funktion in einer Schleife aus:
  3. for Schauen wir uns die laufenden Ergebnisse im Browser an: $data

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.&#39;<br />';
}
Nach dem Login kopieren
Hier ist es perfekt, keinerlei Probleme. (Natürlich kann man die Auswirkung von

nicht sehen)

Denken Sie über ein Problem nachEin übersehenes Tool zur Leistungsoptimierung in PHP: GeneratorenUns ist aufgefallen, dass beim Aufruf der Funktion der an

übergebene Wert lautet 10, was eine sehr kleine Zahl ist. Angenommen, Sie übergeben nun einen Wert

(10 Millionen). sleep(1)

Dann muss in der Funktion

die

-Schleife

zehntausend Mal ausgeführt werden. Und in createRange sind $number zehntausend Werte abgelegt, und das Array 10000000 wird im Speicher abgelegt. Daher wird beim Aufrufen von Funktionen viel Speicher belegt.

Hier kann der Generator ins Spiel kommen. createRangeforGenerator erstellen10001000Wir ändern den Code direkt, bitte achten Sie darauf: $data$data

Sehen Sie sich diesen Code an, der dem gerade sehr ähnlich ist, wir haben das Array gelöscht

und hat nichts zurückgegeben, sondern ein Schlüsselwort

verwendet, bevor

den Generator verwendet hat

function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}
Nach dem Login kopieren
Lassen Sie uns den zweiten Teil des Codes noch einmal ausführen:

$data time()yield

Wir haben auf wundersame Weise festgestellt, dass der Ausgabewert anders ist als beim ersten Mal ohne Verwendung des Generators. Die Werte (Zeitstempel) sind hier im Abstand von 1 Sekunde getrennt.

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);
    echo $value.&#39;<br />';
}
Nach dem Login kopieren
Das Ein-Sekunden-Intervall hier ist eigentlich die Folge von

. Aber warum gibt es beim ersten Mal keine Lücke? Das liegt daran: Ein übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren

Wenn kein Generator verwendet wird: Das Ergebnis der

-Schleife innerhalb der

-Funktion wird schnell in

abgelegt und sofort zurückgegeben. Daher durchläuft sleep(1) ein festes Array.

  • Bei Verwendung von Generatoren: Der Wert von createRange wird nicht schnell auf einmal generiert, sondern basiert auf der for-Schleife. $dataEinmal Schleife und foreacheinmal ausführen.

  • An diesem Punkt sollten Sie eine Vorstellung vom Generator haben. createRangeforeachUmfassendes Verständnis des GeneratorsforeachforCode-Analyse

  • Lassen Sie uns jetzt den Code analysieren.

Lassen Sie uns den Codeausführungsprozess wiederherstellen.

ruft zuerst die Funktion

auf und übergibt den Parameter

, aber der Wert
function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);
    echo $value.&#39;<br />';
}
Nach dem Login kopieren
wird einmal ausgeführt und stoppt dann und teilt

mit, dass die erste Schleife ausgeführt wird nutzbarer Wert.

  1. createRange startet die Schleife auf 10, kommt zuerst for herein und beginnt dann, einen durch foreach gegebenen Wert zu verwenden, um die Ausgabe durchzuführen.

  2. foreach bereitet sich auf die zweite Schleife vor, bevor die zweite Schleife erneut angefordert wird. $resultsleep(1)for

  3. Die Schleife wird dann erneut ausgeführt und
  4. mitgeteilt.

    foreachfor

  5. Der Zeitstempel soll zwei Werte generieren und Ausgabe. Da sich
  6. in

    befindet, wird die for-Schleife um 1 Sekunde verzögert, um die aktuelle Zeit foreach

  7. zu generieren. Daher gibt es während der gesamten Codeausführung immer nur Ein Datensatzwert nimmt an der Schleife teil, der Speicher enthält nur eine Nachricht.

    无论开始传入的$number有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。

    概念理解

    到这里,你应该已经大概理解什么是生成器了。下面我们来说下生成器原理。

    首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值

    那么代码中foreach循环的是什么?其实是PHP在使用生成器的时候,会返回一个Generator类的对象。foreach可以对该对象进行迭代,每一次迭代,PHP会通过Generator实例计算出下一次需要迭代的值。这样foreach就知道下一次需要迭代的值了。

    而且,在运行中for循环执行后,会立即停止。等待foreach下次循环时候再次和for索要下次的值的时候,for循环才会再执行一次,然后立即再次停止。直到不满足条件不执行结束。

    实际开发应用

    很多PHP开发者不了解生成器,其实主要是不了解应用领域。那么,生成器在实际开发中有哪些应用?

    读取超大文件

    PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。

    这里生成器就可以派上用场啦。简单看个例子:读取text文件

    Ein übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren

    我们创建一个text文本文档,并在其中输入几行文字,示范读取。

    <?php
    header("content-type:text/html;charset=utf-8");
    function readTxt()
    {
        # code...
        $handle = fopen("./test.txt", &#39;rb&#39;);
    
        while (feof($handle)===false) {
            # code...
            yield fgets($handle);
        }
    
        fclose($handle);
    }
    
    foreach (readTxt() as $key => $value) {
        # code...
        echo $value.'<br />';
    }
    Nach dem Login kopieren

    Ein übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren

    通过上图的输出结果我们可以看出代码完全正常。

    但是,背后的代码执行规则却一点儿也不一样。使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。

    这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。

    相关推荐:

    php性能优化:isset()比strlen()更快

    最全的php服务器性能优化配置方案

    5个php7性能优化技巧总结

Das obige ist der detaillierte Inhalt vonEin übersehenes Tool zur Leistungsoptimierung in PHP: Generatoren. 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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

See all articles