Czy zamknięcie połączenia mysql jest ważne?

88

Czy ważne jest, aby zamykać połączenia mysql pod względem wydajności, czy też automatycznie zamyka się po uruchomieniu pliku php?

John Yeary
źródło
Zobacz też to pytanie stackoverflow.com/questions/336078/…
alex
Myślę, że to samo dotyczy ftp_close?
doc_id
Czy zamknięcie połączenia mysql jest ważne? tak, jest jak destructor w c ++
jasinth premkumar

Odpowiedzi:

89

Z dokumentacji :

Uwaga: Link do serwera zostanie zamknięty, gdy tylko zakończy się wykonywanie skryptu, chyba że zostanie zamknięty wcześniej przez jawne wywołanie mysql_close ().

Jeśli twój skrypt ma sporo przetwarzania do wykonania po pobraniu wyniku i pobrał pełny zestaw wyników, zdecydowanie powinieneś zamknąć połączenie. Jeśli tego nie zrobisz, istnieje szansa, że ​​serwer MySQL osiągnie limit połączeń, gdy serwer sieciowy jest intensywnie używany. Jeśli nie możesz zamknąć połączenia MySQL przed końcem skryptu, jest to czystsze, choć niepotrzebne jest robienie tego jawnie.

Nie jestem pewien, jak fastcgi wpływa na rzeczy. Jedna strona twierdzi, że kompilacja PHP obsługująca fastcgi utworzy trwałe połączenia, nawet dla mysql_connect. Jest to sprzeczne z dokumentacją, ponieważ połączenie jest zamykane, gdy kończy się proces, a nie skrypt. Zamiast testować, zalecę użycie mysql_close (). Właściwie polecam używanie PDO , jeśli jest dostępne.

poza
źródło
Myślę, że to samo dotyczy ftp_close?
doc_id
4
Czy to oznacza, że ​​jeśli użytkownik zamknie stronę (na przykład) wcześniej (lub wystąpi jakiś błąd), połączenie może pozostać otwarte?
Toni Michel Caubet
1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Kiedy użytkownik zamyka stronę wcześniej, nie ma to znaczenia dla serwera PHP. Uruchamia skrypt jak zawsze i kończy skrypt jak zawsze. Tylko użytkownik nie zobaczy wyniku.
arrowman
9

Czy to ważne? Nie tak bardzo

Czy jest to dobra praktyka do naśladowania? Tak.

Nie rozumiem, dlaczego nie chciałbyś go zamknąć.

ist_lion
źródło
6
Biorąc pod uwagę, że nawet na stronie podręcznika podręcznika jest mysql_closenapisane: „Używanie mysql_close () zwykle nie jest konieczne, ponieważ nietrwałe otwarte linki są automatycznie zamykane po zakończeniu wykonywania skryptu”. Nie uważałbym za złą praktykę niezamykania połączenia.
nico
4
„Nie rozumiem, dlaczego nie chcesz go zamknąć”. Nie chciałbyś go zamykać, gdyby była jakakolwiek szansa, że ​​będziesz go potrzebować ponownie.
Frank Farmer,
1
jeśli użyjesz ajax, to jeśli połączenie zostanie zamknięte, to za każdym razem, gdy spróbujesz użyć ajax, połączenie zostanie otwarte i zamknięte ponownie, a to będzie warte niż pozostawienie otwartego połączenia na serwerze, a klient nie dba o to, czy połączenie jest otwarte, czy nie on dbać o to, aby strona
Robert
to rzeczywiście może być kluczowe !!! jeśli obciążenie serwera jest wysokie i masz dużo niezamkniętych połączeń, jak powiedział ktoś inny, może to doprowadzić do braku odpowiedzi serwera, więc nazwałbym to bardzo istotnym!
oliiix
Lepiej zamknąć. Łatwe i bezproblemowe.
José Carlos PHP
4

Kiedy używasz czegoś takiego jak cgi, całkowicie niepotrzebne jest zamykanie połączeń mysql, ponieważ zamykają się one automatycznie po zakończeniu wykonywania skryptu. Podczas korzystania z trwałych technologii, takich jak mod_perl i innych, które utrzymują połączenia między żądaniami, ważne jest, aby śledzić połączenia, zmienne globalne itp.

Zasadniczo w przypadku trwałych danych posprzątaj po sobie. W przypadku banalnych, nietrwałych danych wszystko to zniknie, gdy żądanie i tak zakończy się. Tak czy inaczej, najlepszą praktyką jest zawsze zamykanie połączeń.

pęto
źródło
1
Mówi o PHP, które nie jest trwałe, więc to nie dotyczy.
Sasha Chedygov
2

Jest zamykany, gdy tylko skrypt zakończy wykonywanie. Chyba że otworzyłeś trwałe połączenie. Najlepiej byłoby zwolnić zasób (połączenie w tym miejscu), gdy tylko skończysz. Chyba że istnieje duża szansa, że ​​wkrótce będziesz go ponownie potrzebować podczas wykonywania.

Pule połączeń lub używanie połączeń trwałych (jeśli o to chodziło) to dobry pomysł, jeśli jesteś za jednym serwerem bazy danych. Jeśli jednak jest więcej serwerów i równoważenie obciążenia może zaszkodzić dystrybucji pracy. Zazwyczaj niektórzy klienci wykonują ciężkie zapytania, a inni lżejsze. Więc jeśli to samo połączenie jest używane przez n ponad, niektóre serwery byłyby mocno obciążone, podczas gdy inne byłyby niewykorzystane. Rozważ użycie mniejszych ttl i zmiennego rozmiaru puli połączeń.

neal aise
źródło
1

Większość CMS zamyka połączenie MySQL na końcu żądania, co jest naprawdę bez znaczenia, ponieważ PHP i tak to zrobi.

Jeśli jednak masz skrypt, w którym połączenie nie jest już potrzebne, powiedzmy w środku skryptu, a następnie mają miejsce inne ciężkie działania, dobrym pomysłem jest jawne zamknięcie połączenia. To zwolni niektóre zasoby.

Obecnie wiele powiedziano o korzyściach płynących z zamykania połączenia, ale prawie nic nie powiedziano o korzyściach wynikających z niezamykania połączenia. Zasadniczo, jeśli nie zamkniesz połączenia na końcu skryptu, to naprawdę oszczędzasz trochę zasobów. Wyobraź sobie aplikację internetową (lub dowolną aplikację) otrzymującą 100 odsłon na sekundę. Tak więc w każdej sekundzie będziesz musiał wywoływać mysqli_close100 razy - co oznacza, że ​​w każdej sekundzie masz 100 niepotrzebnych powrotów do serwera bazy danych, aby zamknąć otwarte połączenia. Z punktu widzenia wydajności jest to czysty narzut, ponieważ PHP i tak sprawdzi, czy istnieją otwarte połączenia po zakończeniu skryptu i zamknie te połączenia, i może tak być, ponieważ wszystko dzieje się tak szybko, że PHP nie widzi, że masz zamknął te połączenia i spróbuje je ponownie zamknąć.

Uwaga: powyższa odpowiedź zakłada, że ​​nie korzystasz z połączeń trwałych (połączenia trwałe nie są używane w żadnym z głównych systemów CMS).

itoctopus
źródło