MySQLi sorgu sonuçları: En iyi yaklaşım, hem ücretsiz, kapatırım?

3 Cevap php

I MySQLi, sorgular, ve ilgili bellek yönetimi kullanma hakkında bazı sorular var. Burada kod sadece benim soruları netleştirmek için, bu yüzden yapılması gerektiğini biliyorum, hata denetimi için üzerine vs dökümü değilsiniz :)

Ben böyle bir şey var varsayalım:

@ $db = new mysqli($dbhost, $un, $ps, $dbname);
$query = "SELECT field1, field2 ".
         "FROM table1 ".
         "WHERE field1={$some_value}";
$results = $db->query($query);

while ($result = $results->fetch_object()) {
    // Do something with the results
}

$query = "SELECT field1, field2 ".
         "FROM table2 ".
         "WHERE field1={$some_value2}";
// question 1
$results = $db->query($query);

while ($result = $results->fetch_object()) {
    // Do something with the second set of results
}

// Tidy up, question 2
if ($results) {
    $results->free();
}
if ($db) {
    $db->close();
}

// Question 3, a general one

Yani, yukarıdaki kod yorumlarına dayanarak, benim sorular şunlardır:

  1. I $results için ikinci sorgunun sonuçlarını atadığınızda, ne daha önceki sonuçlar ile ilişkili bellek olur? Ben yeni bir atamadan önce bu sonucu serbest olmalı mı?

  2. Ben sonunda temizlemek yaptığınızda 1 İlgili, sadece yeterince son sonuçlarını temizlik?

  3. Ben bir sonuç temizlemek için deneyin ne zaman ben kapatarak, ya da her ikisi de olmalı, ben, yukarıdaki gibi onu azat edilmelidir?

mysqli::query için PHP belgeler yakın kullanan bir örnek vardır çünkü yakın mysqli_result ({[örneğe 1 görmek parçası olmasa bile, soru sormak 3 (3)]} ). And in contrast, my normal PHP reference text uses free (PHP and MySQL Web Development, Dördüncü Baskı, Welling ve Thomson).

3 Cevap

When I assign the results of the second query to $results, what happens to the memory associated with the previous results?

Eğer bu idam:

$results = $db->query($query);

Bir şey var ise bunu sol hiçbir referans yoktur gibi $results önce, bu eski içerik, artık erişilemiyor.

Böyle bir durumda, PHP "not needed anymore" olarak değişkenin eski içeriği işaretlemek olacak - ve PHP bazı bellek gerektiğinde bellekten silinecektir.

Bu, en azından, genel PHP değişkenler için de geçerlidir; SQL sorgusu sonuçlarının durumunda olsa da, bazı veriler sürücü düzeyde bellekte tutulabilir - PHP fazla denetime sahip olmadığı üzerinde.


Should I be freeing that result before assigning the new one?

Ben bunu asla - ama, manuel sayfasını alıntı mysqli_result::free :

Note: You should always free your result with mysqli_free_result(), when your result object is not needed anymore

Muhtemelen küçük bir betik ... Ve emin kullanarak, test olacağını olmak için tek yol için farketmez memory_get_usage önce ve bu yöntemi çağrıldıktan sonra, bir var olup olmadığını görmek için farkı veya değil.


Related to 1, when I do clean up at the end, is cleaning up just the last results enough?

Komut sona erdiğinde:

  • Veritabanına bağlantı kapalı olacak - sürücü tarafından kullanılan olabilecek bellek serbest olmalıdır anlamına gelir
  • PHP komut dosyası tarafından kullanılan tüm değişkenler imha edilecek - kullandıkları bellek serbest gerektiği anlamına gelir.

Yani, yazısının sonunda, resultset serbest gerek yok, muhtemelen gerçekten var.


When I do try to clean up a result, should I be freeing it as above, should I be closing it, or both?

Eğer veritabanına bağlantıyı kapatırsanız (using mysqli::close like you proposed), bu veritabanından kesecek.

Hangi Eğer başka bir sorgu yapmak istiyorsanız yeniden bağlamak gerekecek demektir! Hiç iyi değil ki (takes some time, resources, ... )

Ben komut bitmeden kesmek olmaz anlamına gelir - Ben artık ihtiyacım olmayacak, gerçekten eminim kadar Genel olarak konuşursak, veritabanı bağlantısını kapatmak olmaz.

Ve "end of the script" aracı olarak "the connection will be closed" Bunu belirtmek bile; Ben kendimi bağlantısını kapatın hemen hemen hiç.

Zaten sağlanan cevaplar iyi, ama bir nokta eklemek ve başka açıklamak istedim.

İlk olarak, açıklama. Yakın () yönteminin kullanımı ile ilgili olarak, OP yakın (mysqli_result sınıfının) yöntemi değil, mysqli sınıfı referans olduğunu not etmek önemlidir. documentation gösterildiği gibi mysqli sınıfında, bu bağlantıyı kapatır ise sonuç sınıfında, close () yöntemi, sadece serbest () yöntemine bir takma addır. Istenirse Böylece, () ücretsiz yerine sonucu close () kullanmak için tamam.

İkincisi, ek noktası. Zaten işaret edildiği gibi, PHP'nin yürütme desen her şey sonunda arkanızda temizlenmiş olacak ve böylece, mutlaka belleği serbest hakkında endişelenmenize gerek yok demektir. Eğer sonuç nesneleri bir sürü tahsis iseniz, ya da özellikle büyük sonuç nesneleri (örneğin, veri büyük miktarda getiriliyor) tahsis ediyorsanız eğer başka problemleri önlemek için bitirdiniz Ancak, o zaman muhtemelen belleği serbest yürütme yolda. Lütfen uygulama oturumları boyunca bağladı toplam bellek miktarı hızlı bir şekilde önemli olabilir daha fazla trafik almak için başlar bu özellikle önemli hale gelir.

Genel PHP yolu herhangi açılan kaynak kapatmak değildir. Her şey otomatik olarak komut sonunda kapalı olacaktır. Eğer long heavy code PHP için çok yaygın olmadığı, çalıştırmak, varsa manuel yakın bakmak zorunda only durumdur.