sql >> Databasteknik >  >> RDS >> Mysql

Varför stänger vi resultatet i Mysqli

Din kontroll om anslutningen misslyckades faller genom koden som använder anslutningen. Uppenbarligen kommer det inte att fungera eftersom det inte är en live-anslutning. Se till att om anslutningen misslyckas nås inte kod som beror på den. (Observera att jag inte nödvändigtvis förespråkar användning av exit eller die. De kan ge en ganska dålig användarupplevelse. De kan vara användbara, men helst borde du skriva ut ett bättre meddelande och lämna de fula felen i loggar [om du inte' re bara testa eller så är det ett kommandoradsskript]).

När det gäller close() (som faktiskt är ett alias för free()):

free() avallokerar i princip alla saker som är kopplade till resultatet. Du måste förstå att det finns två (förenkling, men följ det) sätt att hämta rader:

Buffert - Allt rycks i ett svep. Med andra ord, när du börjar gå igenom skivorna finns de faktiskt redan i minnet. De är buffrade . De dras inte från servern varje gång du anropar fetch() utan dras snarare från minnet.

Ej buffrad - det kan finnas en liten buffert, men i princip varje gång du anropar fetch() måste PHP hämta en ny rad från databasen. I början av loopen sitter de inte alla i minnet.

Intressant notering:num_rows() kan anropas på en buffrad fråga mycket effektivt eftersom alla rader redan är hämtade (även om du aldrig ska dra alla rader bara för att räkna dem -- det är vad COUNT är till för). Icke buffrade frågor kan inte göra num_rows() förrän de drar alla rader. Det betyder att det antingen kommer att vara ett fel eller i huvudsak förvandla det till en buffrad fråga.

Hur som helst, tillbaka till din egentliga fråga:

free() frigör allt som är associerat med resultatobjektet. I fallet med en buffrad fråga är detta alla rader som sitter i minnet. I fallet med en icke-buffrad fråga kommer free() att släppa alla rader som finns i minnet och sedan avbryta resten av begäran. I grund och botten säger PHP till MySQL, "Hej vet du alla de raderna jag begär? Ändrade mig. Du kan bara släppa den begäran."

När det gäller om du skulle frigöra resultat... Nåväl, när variabeln går utanför räckvidd*, kommer det att hända ändå. Det är dock ingen skada att explicit göra det, och i situationer där en fråga kan använda mycket minne och sedan en annan fråga efter den kan använda mycket minne, kanske du vill frigöra uppsättningarna bara för att hålla minnesanvändningen låg .

* Eller kanske när förfrågan upphör. Jag kommer inte ihåg hur mycket som helst.




  1. Problem med att ställa in MySQLdb-modulen

  2. MySql localhost vs Amazon RDS-instans

  3. Hur lägger man en sträng till ett kolumnvärde i MySQL?

  4. Infoga nya kolumner i mitten av en tabell?