Usando MySQLi – o que é melhor para fechar consultas
Pergunta
Tenho o hábito de manter o uso de variáveis no mínimo.Então, estou me perguntando se há alguma vantagem a ser obtida com o seguinte:
$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');
// Example 1
$query = $query->fetch_assoc();
// Example 2
$query_r = $query->fetch_assoc();
$query->free();
Agora, se estou certo, o Exemplo 1 deve ser mais eficiente, pois $query
é unset
quando eu o reatribuo, o que deve liberar qualquer memória associada a ele.No entanto, existe um método (MySQLi_Result::free()
) que libera memória associada - é a mesma coisa?
Se eu não ligar ::free()
para liberar qualquer memória associada ao resultado, mas unset
reatribuindo a variável estou fazendo a mesma coisa?Não sei como registrar esse tipo de coisa - alguém tem alguma ideia?
Solução
O manual parece sugerir que você ainda deveria estar usando free()
para liberar a memória.Acredito que o raciocínio seja esse free()
está liberando a memória em MySQL, não em PHP.Como o PHP não pode coletar lixo do MySQL, você precisa chamar free()
.
Outras dicas
Exemplo 1 dissocia a variável $query do resultado do MySQL.O resultado do MySQL ainda existe na memória e continuará existindo e desperdiçando memória até que ocorra a coleta de lixo.
Exemplo 2 liberta o resultado do MySQL imediatamente, liberando os recursos utilizados.
No entanto, como as páginas PHP geralmente têm vida curta com pequenos conjuntos de resultados, a memória economizada é trivial.Você não notará uma desaceleração a menos que saia uma tonelada de resultados na memória durante um longo período de tempo em páginas que são executadas por um longo período de tempo.
Brian, Php pode colete o resultado do MySQL, isso simplesmente não acontece imediatamente.O resultado reside no pool de memória do PHP, não no servidor MySQL.
(a localidade da memória ao usar consultas sem buffer é um pouco diferente, mas elas são tão raramente usadas em PHP que não vale a pena mencioná-las)