Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que fechamos o resultado no Mysqli


Sua verificação se a conexão falhou cai no código que usa a conexão. Obviamente, isso não funcionará porque não é uma conexão ao vivo. Certifique-se de que, se a conexão falhar, o código que depende dela não seja alcançado. (Observe que não sou necessário defender o uso de exit ou die. Eles podem causar uma experiência de usuário bastante ruim. Eles podem ser úteis, mas, idealmente, você deve enviar uma mensagem melhor e deixar os erros feios para logs [a menos que você ' re apenas testando ou é um script de linha de comando]).

Quanto a close() (que na verdade é um alias para free()):

free() basicamente desaloca todas as coisas anexadas ao resultado. Você precisa entender que existem duas maneiras (simplificando, mas vá em frente) de recuperar linhas:

Buffered - Tudo é capturado de uma só vez. Em outras palavras, quando você começa a percorrer os registros, eles já estão todos na memória. Eles são bufferizados . Eles não estão sendo puxados do servidor toda vez que você chama fetch(), mas estão sendo puxados da memória.

Sem buffer - pode haver um pequeno buffer, mas essencialmente toda vez que você chama fetch(), o PHP deve puxar uma nova linha do banco de dados. No início do loop, eles não estão todos na memória.

Nota interessante:num_rows() pode ser chamado em uma consulta em buffer de maneira muito eficiente, pois todas as linhas já foram puxadas (embora você nunca deva puxar todas as linhas apenas para contá-las - é para isso que serve COUNT). As consultas sem buffer não podem fazer num_rows() até que puxem todas as linhas. Ou seja, será um erro ou essencialmente o transformará em uma consulta em buffer.

De qualquer forma, voltando à sua pergunta real:

free() libera qualquer coisa associada ao objeto de resultado. No caso de uma consulta em buffer, trata-se de qualquer linha na memória. No caso de uma consulta sem buffer, free() liberará quaisquer linhas que possam estar na memória e, em seguida, cancelará o restante da solicitação. Basicamente é o PHP dizendo ao MySQL:"Ei, você conhece todas aquelas linhas que eu solicito? Mudei de idéia. Você pode simplesmente descartar essa solicitação."

Quanto a liberar resultados... Bem, sempre que a variável sair do escopo*, isso acontecerá de qualquer maneira. No entanto, não há mal em fazê-lo explicitamente, e em situações em que uma consulta pode usar muita memória e depois outra consulta pode usar muita memória, você pode liberar os conjuntos apenas para manter o uso de memória baixo .

* Ou talvez quando o pedido terminar. Não me lembro de cabeça.