Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem der Speichererschöpfung beim Schleifen großer Datenmengen in PHP

So lösen Sie das Problem der Speichererschöpfung beim Schleifen großer Datenmengen in PHP

coldplay.xixi
coldplay.xixinach vorne
2020-08-31 17:22:383586Durchsuche

So lösen Sie das Problem der Speichererschöpfung beim Schleifen großer Datenmengen in PHP

bezogene Lernempfehlungen: Php Programmierung (Video) i hat kürzlich den folgenden Fehler bei der Entwicklung eines PHP 456 Bytes erschöpft

Die Fehlermeldung zeigt an, dass der maximal zulässige Speicher erschöpft ist. Ich war zunächst überrascht, auf einen solchen Fehler zu stoßen, aber nachdem ich darüber nachgedacht habe, ist er nicht überraschend, da das von mir entwickelte Programm eine

-Schleifenanweisung verwendet, um die gesamte Tabelle mit bestimmten Merkmalen in einer Tabelle mit 40.000 Daten zu durchsuchen. Das heißt, es müssen jeweils 40.000 Daten herausgenommen und dann die täglichen Daten einzeln überprüft werden. Es ist denkbar, dass alle 40.000 Daten in den Speicher geladen werden. Es wäre seltsam, wenn der Speicher nicht platzt.

Schließlich programmiere ich schon so viele Jahre und erinnere mich vage daran, dass PHP eine API bereitstellt, die nicht alle Daten auf einmal lädt. Es handelt sich um eine Abfragemethode, die wie Streaming-Medien verwendet und verloren gehen kann sammelt sich nicht im Speicher an. Nach einer einfachen Suche habe ich die richtige Verwendung auf der offiziellen Website gefunden.

Dieses Problem wird auf der offiziellen Website von PHP als gepufferte und ungepufferte Abfragen bezeichnet. Der Standardabfragemodus von PHP ist der gepufferte Modus. Mit anderen Worten: Die Ergebnisse der Abfragedaten werden auf einmal in den Speicher extrahiert, um sie vom PHP-Programm zu verarbeiten. Dadurch erhält das PHP-Programm zusätzliche Funktionen, wie z. B. das Zählen der Zeilenanzahl, das Zeigen des Zeigers auf eine bestimmte Zeile usw. Noch wichtiger ist, dass das Programm wiederholt sekundäre Abfragen und Filtervorgänge für den Datensatz durchführen kann. Der Nachteil dieses gepufferten Abfragemodus besteht jedoch darin, dass er Speicher verbraucht, d. h. Platz gegen Geschwindigkeit eintauscht.

foreachIm Gegensatz dazu ist ein anderer PHP-Abfragemodus eine nicht gepufferte Abfrage. Der Datenbankserver gibt die Daten einzeln und nicht alle auf einmal zurück. Das Ergebnis ist, dass das PHP-Programm weniger Speicher verbraucht, aber die Belastung der Datenbank erhöht Server, da die Datenbank darauf wartet, dass PHP die Daten abruft, bis alle Daten abgerufen sind.

Natürlich eignet sich der gepufferte Abfragemodus für Abfragen mit kleinem Datenvolumen, während die nicht gepufferte Abfrage für Abfragen mit großem Datenvolumen geeignet ist.

Jeder kennt die gepufferte Abfrage-API von PHP. Das unten aufgeführte Beispiel zeigt, wie die nicht gepufferte Abfrage-API ausgeführt wird.

Ungepufferte Abfragemethode eins: mysqli

<?php
$mysqli  = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);

if ($uresult) {
   while ($row = $uresult->fetch_assoc()) {
       echo $row[&#39;Name&#39;] . PHP_EOL;
   }
}
$uresult->close();
?>

Ungepufferte Abfragemethode zwei: pdo_mysql

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", &#39;my_user&#39;, &#39;my_pass&#39;);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo $row[&#39;Name&#39;] . PHP_EOL;
   }
}
?>

Ungepufferte Abfragemethode drei: mysql

<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db   = mysql_select_db("world");

$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
   while ($row = mysql_fetch_assoc($uresult)) {
       echo $row[&#39;Name&#39;] . PHP_EOL;
   }
}
?>

php Chinesische Internetnutzer beschwerten sich:

Dieses Ding sollte a verwenden Generator

Diese Schreibweise kann direkt verwendet werden

Es ist unmöglich, Big Data auf diese Weise zu verarbeiten

Der chinesische PHP-Internetnutzer Xiao Chen hat einen richtigen Weg angegeben

<?php

if (!function_exists(&#39;getYieldBigData&#39;)) {
    /**
     * 使用生成器返回生成器对象
     * @param array $data
     * @return Generator
     */
    function getYieldBigData($data = [])
    {
        foreach ($data as $tmp_data) {
            yield $tmp_data;
        }
        unset($tmp_data);
    }
}


if (!function_exists(&#39;foreachBigData&#39;)) {
    /**
     * 循环大量数据使用生成器来制造值
     * @param array $data
     * @return array|false
     */
    function foreachBigData($data = [])
    {
        if (0 == count($data)) {
            return false;
        }
        $tmp = [];
        foreach (getYieldBigData($data) as $v) {
            $tmp[] = $v;
        }
        unset($v);
        return $tmp;
    }
}

//调用方法
/**
 * @var $data array
 */
$data = [];
/**
 * @var $ret array
 */
$ret = foreachBigData($data);

return $ret;

Neulinge können es auch verstehen Verstanden!

Wie oben kann diese Methode 1 Million pro Mal erreichen!

Dieser Artikel stammt vom Kanal

php-Grafik-TutorialSo lösen Sie das Problem der Speichererschöpfung beim Schleifen großer Datenmengen in PHP der chinesischen PHP-Website, ursprünglicher Autor: God of War Wukong, sekundärer Herausgeber der chinesischen PHP-Website.

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Speichererschöpfung beim Schleifen großer Datenmengen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:webhek.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen