Fechar a conexão mysql é importante?

88

É crucial fechar a eficiência das conexões mysql ou ele fecha automaticamente após a execução do arquivo php?

John Yeary
fonte
Veja esta pergunta também stackoverflow.com/questions/336078/…
alex
Eu acho que o mesmo se aplica a ftp_close?
doc_id
Fechar a conexão mysql é importante? sim, é como o destruidor em c ++
jasinth premkumar

Respostas:

89

Da documentação :

Nota: O link para o servidor será fechado assim que a execução do script terminar, a menos que seja fechado antes chamando explicitamente mysql_close ().

Se o seu script tiver uma boa quantidade de processamento a ser executado depois de buscar o resultado e tiver recuperado o conjunto de resultados completo, você definitivamente deve fechar a conexão. Caso contrário, há uma chance de o servidor MySQL atingir seu limite de conexão quando o servidor web estiver sob uso intenso. Se você não puder fechar a conexão MySQL até próximo ao final do script, é mais limpo, embora desnecessário fazer isso explicitamente.

Não tenho certeza de como o fastcgi afeta as coisas. Uma página afirma que uma construção de PHP que suporta fastcgi criará conexões persistentes, mesmo para mysql_connect. Isso contradiz a documentação de que a conexão é encerrada quando o processo, em vez do script, termina. Em vez de testá-lo, vou recomendar o uso de mysql_close (). Na verdade, eu recomendo usar o PDO , se estiver disponível.

outis
fonte
Eu acho que o mesmo se aplica a ftp_close?
doc_id
4
Isso significa que se o usuário fechar a página (por exemplo) mais cedo (ou houver algum erro), a conexão pode permanecer aberta?
Toni Michel Caubet
1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Quando o usuário fecha uma página antes do tempo, não importa para o servidor PHP. Ele executa o script como sempre e termina o script como sempre. Apenas o usuário não verá o resultado.
flechador
@ToniMichelCaubet Você sabe que o php é executado no servidor?
clockw0rk
1
Sim, mas você percebe que meu comentário foi há 5 anos?
Toni Michel Caubet
9

É crucial? Não muito

É considerada uma boa prática a seguir? Sim.

Não vejo por que você não gostaria de fechá-lo.

ist_lion
fonte
6
Bem, considerando que até mesmo a página de manual para mysql_closediz "Usar mysql_close () geralmente não é necessário, pois links abertos não persistentes são automaticamente fechados no final da execução do script." Eu realmente não consideraria uma má prática não fechar a conexão.
nico
4
"Não vejo por que você não gostaria de fechá-lo." Você não gostaria de fechá-lo se houver alguma chance de você precisar dele novamente.
Frank Farmer
1
se você usar ajax então se a conexão for fechada então toda vez que você tentar usar ajax a conexão será aberta e fechada novamente e isso valerá a pena deixar a conexão aberta para o servidor e o cliente não se importar com a conexão aberta ou não ele cuidado para que o site seja rápido
Robert,
de fato, pode ser crucial !!! se a carga do servidor estiver alta e você tiver muitas conexões não fechadas, como dito por outra pessoa mais acima, isso pode levar a um servidor que não responde, então eu diria que é muito importante!
oliiix
Melhor fechar. Fácil e sem problemas.
José Carlos PHP
4

Ao usar algo como cgi, é completamente desnecessário fechar suas conexões mysql, pois elas fecham automaticamente no final da execução do script. Ao usar tecnologias persistentes como mod_perl e outras, que mantêm suas conexões entre as solicitações, é importante manter o controle das conexões, variáveis ​​globais, etc.

Basicamente, para dados persistentes, limpe depois de você. Para dados triviais e não persistentes, tudo irá embora quando a solicitação terminar. De qualquer forma, a melhor prática é sempre fechar suas conexões.

jess
fonte
1
Ele está falando sobre PHP, que não é persistente, então isso não se aplica.
Sasha Chedygov
2

É fechado assim que o script conclui a execução. A menos que você tenha aberto uma conexão persistente. Idealmente, você deve liberar um recurso (uma conexão aqui) assim que terminar de usá-lo. A menos que haja uma boa chance de que você precise dele novamente em breve na execução.

O pool de conexões ou o uso de conexões persistentes (se é o que você quis dizer) é uma boa ideia se você estiver atrás de um único servidor de banco de dados. No entanto, se houver mais servidores e você estiver fazendo o balanceamento de carga, isso pode prejudicar a distribuição do trabalho. Normalmente, alguns clientes executam consultas pesadas, enquanto outros executam consultas mais leves. Portanto, se a mesma conexão for usada em mais de n, alguns servidores sofrerão uma carga pesada, enquanto outros estarão subutilizados. Considere o uso de ttls menores e tamanho de pool de conexão variável.

neal aise
fonte
1

A maioria dos CMSs fecha a conexão MySQL no final da solicitação, o que é realmente insignificante, porque o PHP fará isso de qualquer maneira.

No entanto, se você tiver um script em que a conexão não é mais necessária, digamos no meio do script, e então outras atividades pesadas acontecem, é uma boa ideia fechar explicitamente a conexão. Isso irá liberar alguns recursos.

Agora, muito se falou sobre os benefícios de fechar uma conexão, mas quase nada foi dito sobre os benefícios de não fechá-la. Essencialmente, se você não fechar a conexão no final de um script, você realmente estará economizando alguns recursos. Imagine um aplicativo da web (ou qualquer aplicativo) recebendo 100 visualizações de página / segundo. Portanto, a cada segundo, você precisará invocar mysqli_close100 vezes - o que significa que, a cada segundo, você terá 100 viagens de ida e volta desnecessárias ao servidor de banco de dados para fechar as conexões abertas. Do ponto de vista do desempenho, isso é pura sobrecarga, já que o PHP verificará se há conexões abertas quando o script for concluído de qualquer maneira e fechará essas conexões, e pode ser que, porque tudo acontece tão rapidamente, que o PHP não veja que você tem fechou essas conexões e tentará fechá-las novamente.

Observação: a resposta acima assume que você não está usando conexões persistentes (conexões persistentes não são usadas em nenhum dos principais CMSs).

itoctopus
fonte