PHP 8.5.0 Alpha 2 available for testing

Consultas con o sin almacenamiento en memoria

Las consultas utilizan por omisión el modo de almacenamiento en memoria. Esto significa que el resultado de las consultas se transfiere inmediatamente del servidor MySQL a PHP y se conserva en la memoria del proceso PHP. Esto permite operaciones complementarias como contar el número de resultados, y desplazar el puntero de resultado actual. También permite ejecutar consultas adicionales sobre la misma conexión mientras se trabaja con el conjunto de resultados. La desventaja del almacenamiento en memoria es que los conjuntos de resultados grandes pueden requerir mucha más memoria. La memoria permanecerá ocupada hasta que todas las referencias a los conjuntos de resultados sean desactivadas o que los conjuntos de resultados sean liberados explícitamente, lo cual ocurre de manera automática al final del proceso. La terminología "store result" también se utiliza con el modo de almacenamiento en memoria, ya que la totalidad de los resultados se almacenan a la vez.

Nota:

Cuando se utiliza libmysqlclient como biblioteca, el límite de memoria de PHP no contará la memoria utilizada para los conjuntos de resultados a menos que los datos sean leídos en las variables PHP. Con mysqlnd, la memoria utilizada incluirá el conjunto de resultados completo.

Las consultas sin almacenamiento en memoria, las consultas MySQL ejecutan su consulta y luego esperan que los datos del servidor MySQL sean recuperados. Esto utiliza menos memoria en el lado de PHP, pero puede aumentar la carga en el servidor. A menos que el conjunto de resultados completo haya sido recuperado desde el servidor, ninguna otra consulta puede ser enviada sobre la misma conexión. Las consultas sin almacenamiento en memoria también pueden hacer referencia a un "use result". Una vez que todas las líneas del conjunto de resultados han sido recuperadas, el conjunto de resultados desaparece y ya no es posible recorrerlo nuevamente.

Siguiendo estas características, las consultas sin almacenamiento en memoria deben ser utilizadas únicamente cuando se espera obtener un gran conjunto de resultados que será procesado secuencialmente. Las consultas sin almacenamiento en memoria presentan varias trampas que las hacen más difíciles de utilizar, por ejemplo el número de líneas en el conjunto de resultados no es conocido antes de que la última línea sea recuperada.

Debido a que las consultas son almacenadas en memoria por omisión, los ejemplos a continuación muestran cómo ejecutar consultas, con cada API, sin almacenamiento en memoria.

Ejemplo #1 Ejemplo de consultas sin almacenamiento en memoria: mysqli

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

foreach (
$unbufferedResult as $row) {
echo
$row['Name'] . PHP_EOL;
}
?>

Ejemplo #2 Ejemplo de consultas sin almacenamiento en memoria: pdo_mysql

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

$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach (
$unbufferedResult as $row) {
echo
$row['Name'] . PHP_EOL;
}
?>
add a note

User Contributed Notes 1 note

up
0
polygon dot co dot in at gmail dot com
1 year ago
The bufferred and unbuffered queries can be used for a limited amount of records.

For example; while implementing download CSV for a query using buffered way, memory limit issues comes up above 30,000 records to be buffered.

Similarly, For unbuffered the load switched to database server.

This load on both the web (buffered) and MySQL (unbuffered) servers can be reduced as below supporting download CSV for 30,000+ records.

<?php
// Shell command.
$shellCommand = 'mysql '
. '--host='.escapeshellarg($hostname).' '
. '--user='.escapeshellarg($username).' '
. '--password='.escapeshellarg($password).' '
. '--database='.escapeshellarg($database).' '
. '--execute='.escapeshellarg($sql).' '
. '| sed -e \'s/"/""/g ; s/\t/","/g ; s/^/"/g ; s/$/"/g\'';

// CSV headers
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$csvFilename}");
header("Pragma: no-cache");
header("Expires: 0");

// Execute command via shell and echo the complete output as a string
echo shell_exec($shellCommand);
?>

There will be a bit of CPU consumption for the sed regex.
To Top