sql >> Database >  >> RDS >> Mysql

Waarom sluiten we het resultaat in Mysqli

Uw controle als de verbinding is mislukt, valt door de code die de verbinding gebruikt. Dat werkt natuurlijk niet omdat het geen live verbinding is. Zorg ervoor dat als de verbinding mislukt, de code die ervan afhangt niet wordt bereikt. (Merk op dat ik niet per se pleit voor het gebruik van exit or die. Ze kunnen voor een nogal slechte gebruikerservaring zorgen. Ze kunnen nuttig zijn, maar idealiter zou je een beter bericht moeten weergeven en de lelijke fouten voor logs [tenzij je ' re alleen testen of het is een opdrachtregelscript]).

Wat betreft close() (wat eigenlijk een gratis alias is()):

free() deloceert in feite alle dingen die aan het resultaat zijn gekoppeld. U moet begrijpen dat er twee (vereenvoudiging, maar daarmee samenhangende) manieren zijn om rijen op te halen:

Gebufferd - Alles wordt in één keer weggerukt. Met andere woorden, tegen de tijd dat u door de records begint te bladeren, staan ​​ze eigenlijk allemaal al in het geheugen. Ze zijn gebufferd . Ze worden niet elke keer dat je fetch() aanroept van de server gehaald, maar eerder uit het geheugen.

Niet gebufferd - er kan een kleine buffer zijn, maar in wezen moet PHP elke keer dat u fetch() aanroept, een nieuwe rij uit de database halen. Aan het begin van de lus zitten ze niet allemaal in het geheugen.

Interessante opmerking:num_rows() kan zeer efficiënt worden aangeroepen op een gebufferde query omdat alle rijen al zijn opgehaald (hoewel je nooit alle rijen moet ophalen om ze te tellen - daar is COUNT voor). Niet-gebufferde query's kunnen num_rows() niet uitvoeren totdat ze alle rijen hebben opgehaald. Dit betekent dat het ofwel een fout is, of het in wezen verandert in een gebufferde zoekopdracht.

Hoe dan ook, terug naar je eigenlijke vraag:

free() bevrijdt alles dat is gekoppeld aan het resultaatobject. In het geval van een gebufferde query zijn dit alle rijen die in het geheugen zitten. In het geval van een niet-gebufferde query, zal free() de rijen die zich in het geheugen bevinden vrijgeven en vervolgens de rest van het verzoek annuleren. Eigenlijk is het PHP die MySQL vertelt:"Hé, ken je al die rijen die ik aanvraag? Ik ben van gedachten veranderd. Je kunt dat verzoek gewoon laten vallen."

Wat betreft of je resultaten zou moeten vrijgeven... Welnu, wanneer de variabele buiten bereik* gaat, zal het hoe dan ook gebeuren. Het kan echter geen kwaad om het expliciet te doen, en in situaties waarin een query veel geheugen kan gebruiken en vervolgens een andere query nadat deze veel geheugen kan gebruiken, wilt u misschien de sets vrijmaken om het geheugengebruik laag te houden .

* Of misschien wanneer het verzoek eindigt. Ik herinner het me niet uit mijn hoofd.




  1. RESTful API of Socket.IO

  2. Gegevens aanwezig in rijen naar kolommen

  3. GEBRUIK HINT en DISABLE_OPTIMIZED_NESTED_LOOP

  4. Zijn we klaar voor Nordic PGDay?