Mysql
 sql >> Database >  >> RDS >> Mysql

Perché chiudiamo il risultato in Mysqli

Il tuo controllo se la connessione non è riuscita passa al codice che utilizza la connessione. Ovviamente non funzionerà perché non è una connessione live. Assicurati che se la connessione fallisce, il codice che dipende da esso non viene raggiunto. (Nota che non sono necessario sostenere l'uso di exit o die. Possono creare un'esperienza utente piuttosto negativa. Possono essere utili, ma idealmente dovresti generare un messaggio migliore e lasciare la brutta roba di errore per i log [a meno che tu' re solo test o è uno script della riga di comando]).

Per quanto riguarda close() (che in realtà è un alias per free()):

free() sostanzialmente dealloca tutte le cose allegate al risultato. Devi capire che ci sono due modi (semplificazione, ma vai con esso) per recuperare le righe:

Buffered - Tutto viene strappato in una volta sola. In altre parole, quando inizi a scorrere i record, in realtà sono già tutti in memoria. Sono bufferizzati . Non vengono estratti dal server ogni volta che si chiama fetch(), ma piuttosto vengono estratti dalla memoria.

Non bufferizzato - potrebbe esserci un piccolo buffer, ma essenzialmente ogni volta che chiami fetch(), PHP deve estrarre una nuova riga dal database. All'inizio del ciclo, non sono tutti presenti nella memoria.

Nota interessante:num_rows() può essere chiamato su una query nel buffer in modo molto efficiente poiché tutte le righe sono già state estratte (anche se non dovresti mai estrarre tutte le righe solo per contarle - ecco a cosa serve COUNT). Le query non memorizzate nel buffer non possono eseguire num_rows() finché non estraggono tutte le righe. Ciò significa che sarà un errore o lo trasformerà essenzialmente in una query memorizzata nel buffer.

Ad ogni modo, torniamo alla tua vera domanda:

free() libera tutto ciò che è associato all'oggetto risultato. Nel caso di una query memorizzata nel buffer, si tratta di qualsiasi riga in memoria. Nel caso di una query non memorizzata nel buffer, free() rilascerà tutte le righe che potrebbero trovarsi in memoria e quindi annullerà il resto della richiesta. Fondamentalmente è PHP che dice a MySQL:"Ehi, conosci tutte quelle righe che richiedo? Ho cambiato idea. Puoi semplicemente abbandonare quella richiesta".

Per quanto riguarda se dovessi liberare i risultati... Bene, ogni volta che la variabile esce dall'ambito*, accadrà comunque. Non c'è, tuttavia, alcun danno nel farlo esplicitamente e nelle situazioni in cui una query può utilizzare molta memoria e quindi un'altra query dopo che potrebbe utilizzare molta memoria, potresti voler liberare i set solo per mantenere basso l'utilizzo della memoria .

* O forse al termine della richiesta. Non mi ricordo a capofitto.