saklanır ve mysqli_result sonuçları almak nasıl, bellek kullanımı son derece küçüktür. Ancak, sorgudaki tüm satırları çağrışımsal bir diziye aldığımda, bellek kullanımı çok yüksek olur.PHP: Sorgu sonuçları Ben veritabanına bir sorgu yaptığında 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
?>
Bu çok sonuç saklamak tüketen çok anı olduğunu bana mantıklı, ama sadece mysqli_result çok küçük nasıl oluyor merak ediyorum. Fetch_assoc çağrıldığında, sonuçların dbase'e sorgulanması mümkün olamaz. Öyleyse, sonuçta bellekte saklanan sonuçlar. Yayınladığınız
while($row = $r->fetch_assoc()){
//Do whatever you need with the record, then:
unset($row);
}
yolu $rows
büyük bir dizi topluyor ve bellek kullanımı olduğunu yansıtır:
ben 'mysql_ *' fonksiyonları seferde sunucudan sonucu tüm satırları getirme olduğunu okumuştum. Ancak PDO (ve muhtemelen mysqli) her bir satırı talep üzerine alır. Böylece her çağrı için biraz hafıza kullanacaksınız. Ancak her satırı bir dizide saklarsınız, bu nedenle bellek kullanımınızın birikir anlamına gelir. –
Bunu yapmak için her aramada mysqli, sonuç için veritabanını sorgulayacak mı? – spchuang
Anlayışımdan 'query() 'dediğinizde, MySQL sorguyu gerçekleştirir ve tüm sonuç satırlarını PHP'ye döndürmeye hazırlanır. Bununla birlikte, eğer mysqli PDO'ya benziyorsa (en azından PDO'nun varsayılanı), siz çağırmayı çağırıncaya kadar satır almaya başlamaz. FetchAll() 'adını vermediğiniz sürece, her satır birer birer alınacaktır. Bu, bellek kullanımınızın, sonuçları mysqli nedeniyle değil bir dizide kaydettiğiniz anlamına gelir. –