Quando ho eseguito una query sul database e recuperato i risultati in mysqli_result, l'utilizzo della memoria è estremamente ridotto. Tuttavia, quando si prelevano tutte le righe nella query vengono restituite a un array associativo, l'utilizzo della memoria diventa estremamente elevato.PHP: come vengono archiviati i risultati della query in mysqli_result
<?php
require_once("../config.php"); //db connection config
$db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);
$query ="select * from table_name";
if($r = $db->query($query)){
echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>";
$rows = array();
while($row = $r->fetch_assoc()){
$rows[]= $row;
}
echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>";
//before: 660880
//after: 114655768
// # of records: around 30 thousands
?>
ha senso per me che la memorizzazione di questo molti risultati è molto consumo di memoria, ma mi chiedo solo come mai mysqli_result è così piccolo. Non può essere che i risultati vengano interrogati su dbase ogni volta che viene chiamata fetch_assoc. Allora, dove sono i risultati memorizzati nella memoria.
Ho letto da qualche parte che le funzioni 'mysql_ *' recuperano tutte le righe dei risultati dal server contemporaneamente. Tuttavia PDO (e probabilmente mysqli) recupera ogni riga su richiesta. Quindi, con ogni chiamata da recuperare, userai un po 'di memoria. Ma memorizzi ogni riga in un array, quindi è logico che l'utilizzo della memoria si accumuli. –
Vuoi dire che con ogni chiamata da recuperare, mysqli interrogherà il database per il risultato? – spchuang
Da quanto ho capito, quando chiamate 'query()' MySQL esegue la query e si prepara a restituire tutte le righe dei risultati a PHP. Tuttavia, se mysqli è come PDO (almeno il valore predefinito di PDO), non inizierà a ricevere le righe finché non chiami Fetch. A meno che tu non chiami 'fetchAll()', ogni riga verrà recuperata una alla volta. Ciò significa che l'utilizzo della memoria è perché hai salvato i risultati in un array, non a causa di mysqli. –