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

PHP查询大量数据内存耗尽问题的解决方法

Se muestra un mensaje de contenido insuficiente al consultar grandes cantidades de datos desde la base de datos:

PHP Fatal error: Tamaño de memoria permitido de 268 435 456 bytes exhausted

Este problema en el sitio web oficial de PHP se llama consulta almacenada y no almacenada (Buffered and Unbuffered queries). El modo de consulta predeterminado de PHP es el modo almacenado. Esto significa que los resultados de la consulta se extraen al completo en la memoria para que el programa PHP los procese. Esto ofrece al programa PHP funciones adicionales, como calcular el número de filas, posicionar el puntero en una fila, etc. Además, el programa puede realizar operaciones de consulta y filtrado repetidas en el conjunto de datos. Pero la deficiencia de este modo de consulta almacenada es que consume memoria, es decir, cambia el espacio por velocidad.

Por el contrario, otro modo de consulta de PHP es la consulta no almacenada, el servidor de bases de datos devuelve los datos uno por uno, en lugar de devolverlos todos a la vez. Este resultado es que el programa PHP consume menos memoria, pero aumenta la presión sobre el servidor de bases de datos, ya que la base de datos esperará a que PHP reciba los datos hasta que se hayan devuelto todos los datos.

Es evidente que el modo de consulta almacenada es adecuado para consultas de pequeñas cantidades de datos, mientras que la consulta no almacenada es adecuada para consultas de grandes volúmenes de datos.

Todos sabemos que el modo de almacenamiento en caché de PHP para consultas, a continuación, se enumeran los ejemplos de cómo ejecutar la API de consulta no almacenada.

 Método de consulta no almacenado uno: 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(); 
?> 

Método de consulta no缓冲 dos: 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; 
  } 
} 
?> 

Método de consulta no缓冲三: 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; 
  } 
} 
?> 

Este es el contenido completo del artículo, esperamos que sea útil para su aprendizaje y que todos apoyen a Tutorial de Gritos.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido ha sido contribuido y subido por usuarios de Internet de manera autónoma, este sitio no posee los derechos de propiedad, no ha sido editado artificialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)