English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Solution to the problem of PHP running out of memory when querying a large amount of data

Beim Abfragen großer Datenmengendaten aus der Datenbank kann eine Warnung erscheinen, dass der Inhalt nicht ausreicht:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

Dieses Problem wird auf der offiziellen PHP-Website als gepufferte und nicht-puffernde Abfragen (Buffered and Unbuffered queries) bezeichnet. Der Standardabfrage-Modus von PHP ist der gepufferte Modus. Das bedeutet, dass die Ergebnisse der Abfrage einmal vollständig in den Speicher extrahiert werden, um sie dem PHP-Programm zur Verarbeitung zur Verfügung zu stellen. Dies gibt dem PHP-Programm zusätzliche Funktionen, wie z.B. das Berechnen der Anzahl der Zeilen, das Setzen des Zeigers auf eine bestimmte Zeile usw. Wichtiger ist jedoch, dass das Programm den Datensatz wiederholt nachfragen und filtern kann. Ein Nachteil dieses gepufferten Abfrage-Modus ist jedoch, dass er Speicher verbraucht, also wird mit Platz für Geschwindigkeit getauscht.

Im Gegensatz dazu ist eine andere Abfrageart in PHP die nicht-puffernde Abfrage, bei der der Datenbankserver die Daten Zeile für Zeile zurückgibt, anstatt sie alle auf einmal zurückzugeben. Das Ergebnis ist, dass das PHP-Programm weniger Speicher verbraucht, aber die Belastung des Datenbank-Servers zunimmt, da der Datenbankserver immer darauf wartet, dass PHP die Daten abruft, bis alle Daten abgerufen sind.

Es ist offensichtlich, dass der gepufferte Abfrage-Modus für kleine Datenmengen geeignet ist, während die nicht-puffernde Abfrage für große Datenmengen geeignet ist.

Über die gepufferten Abfrage-Modi in PHP sind alle bekannt, unten wird ein Beispiel gezeigt, wie man nicht-puffernde Abfrage-API ausführt.

 Nicht-puffernde Abfrageart 1: 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['Name'] . PHP_EOL; 
  } 
} 
$uresult->close(); 
?> 

Zweite Methode zur nicht-buffered Abfrage: pdo_mysql

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$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['Name'] . PHP_EOL; 
  } 
} 
?> 

Dritter Methode zur nicht-buffered Abfrage: 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['Name'] . PHP_EOL; 
  } 
} 
?> 

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anleitungshilfe mehr unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrecht des Urhebers. Der Inhalt wurde von Internetbenutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte mit Urheberrechtsverletzungen finden, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Täuschung wird diese Website den fraglichen Inhalt sofort löschen.)

You may also like