Hinweis: Die Verbindung zum Server wird geschlossen, sobald die Ausführung des Skripts beendet ist, es sei denn, sie wird früher durch expliziten Aufruf von mysql_close () geschlossen.
Wenn Ihr Skript nach dem Abrufen des Ergebnisses ausreichend Verarbeitungsaufwand hat und die vollständige Ergebnismenge abgerufen hat, sollten Sie die Verbindung auf jeden Fall schließen. Wenn Sie dies nicht tun, besteht die Möglichkeit, dass der MySQL-Server sein Verbindungslimit erreicht, wenn der Webserver stark ausgelastet ist. Wenn Sie die MySQL-Verbindung erst gegen Ende des Skripts schließen können, ist dies sauberer, obwohl dies nicht explizit erforderlich ist.
Ich bin mir nicht sicher, wie Fastcgi die Dinge beeinflusst. Eine Seite behauptet, dass ein Build von PHP, der fastcgi unterstützt, dauerhafte Verbindungen schafft, selbst für mysql_connect. Dies widerspricht der Dokumentation dahingehend, dass die Verbindung geschlossen wird, wenn der Prozess und nicht das Skript endet. Anstatt es zu testen, empfehle ich die Verwendung von mysql_close (). Eigentlich empfehle ich die Verwendung von PDO , falls verfügbar.
Bedeutet das, dass die Verbindung möglicherweise geöffnet bleibt, wenn der Benutzer die Seite (zum Beispiel) vorzeitig schließt (oder ein Fehler vorliegt)?
Toni Michel Caubet
1
@ Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Wenn der Benutzer eine Seite vorzeitig schließt, spielt dies keine Rolle für den PHP-Server. Es führt das Skript wie immer aus und beendet das Skript wie immer. Nur der Benutzer sieht kein Ergebnis.
Pfeilmann
@ToniMichelCaubet Sie wissen, dass PHP auf der Serverseite ausgeführt wird?
clockw0rk
1
Ja, aber ist dir klar, dass mein Kommentar vor 5 Jahren war?
Toni Michel Caubet
9
Ist es entscheidend? Nicht so viel
Wird es als eine gute Praxis angesehen, zu folgen? Ja.
Ich verstehe nicht, warum Sie es nicht schließen wollen.
Nun, wenn man bedenkt, dass sogar die Handbuchseite für mysql_close"Die Verwendung von mysql_close () ist normalerweise nicht erforderlich, da nicht persistente offene Links am Ende der Skriptausführung automatisch geschlossen werden." Ich würde es nicht für eine schlechte Praxis halten, die Verbindung nicht zu schließen.
Nico
4
"Ich verstehe nicht, warum du es nicht schließen willst." Sie möchten es nicht schließen, wenn die Möglichkeit besteht, dass Sie es erneut benötigen.
Frank Farmer
1
Wenn Sie Ajax verwenden, wird die Verbindung jedes Mal, wenn Sie versuchen, Ajax zu verwenden, geöffnet und wieder geschlossen. Dies ist sinnvoll, als die Verbindung zum Server offen zu lassen, und der Client kümmert sich nicht darum, ob die Verbindung offen ist oder nicht Sorge, dass die Website Geschwindigkeit ist
Robert
es kann in der Tat entscheidend sein !!! Wenn die Serverlast hoch ist und Sie viele nicht geschlossene Verbindungen haben, wie von jemand anderem weiter oben gesagt, dass dies zu einem nicht reagierenden Server führen kann, würde ich es als ziemlich wichtig bezeichnen!
17.
Besser schließen. Einfach und problemlos.
José Carlos PHP
4
Wenn Sie so etwas wie cgi verwenden, ist es völlig unnötig, Ihre MySQL-Verbindungen zu schließen, da diese am Ende der Skriptausführung automatisch geschlossen werden. Wenn Sie persistente Technologien wie mod_perl und andere verwenden, die Ihre Verbindungen zwischen Anforderungen aufrechterhalten, ist es wichtig, Verbindungen, globale Variablen usw. im Auge zu behalten.
Bereinigen Sie grundsätzlich für dauerhafte Daten nach sich selbst. Bei trivialen, nicht persistenten Daten verschwindet alles, wenn die Anforderung trotzdem abgeschlossen ist. In jedem Fall empfiehlt es sich, die Verbindungen immer zu schließen.
Er spricht von PHP, das nicht persistent ist, also trifft das nicht zu.
Sasha Chedygov
2
Wird geschlossen, sobald das Skript die Ausführung abgeschlossen hat. Es sei denn, Sie haben eine dauerhafte Verbindung hergestellt. Idealerweise sollten Sie eine Ressource (hier eine Verbindung) freigeben, sobald Sie damit fertig sind. Es sei denn, es besteht eine gute Chance, dass Sie es sehr bald bei der Ausführung wieder benötigen.
Verbindungspooling oder die Verwendung dauerhafter Verbindungen (wenn Sie dies gemeint haben) ist eine gute Idee, wenn Sie sich hinter einem einzelnen Datenbankserver befinden. Wenn jedoch mehr Server vorhanden sind und Sie einen Lastenausgleich durchführen, kann dies die Arbeitsverteilung beeinträchtigen. In der Regel führen einige Clients umfangreiche Abfragen aus, während andere leichtere Abfragen ausführen. Wenn also dieselbe Verbindung über n verwendet wird, sind einige Server stark ausgelastet, während andere nicht ausgelastet sind. Erwägen Sie die Verwendung kleinerer ttls und einer variablen Verbindungspoolgröße.
Die meisten CMS schließen die MySQL-Verbindung am Ende der Anfrage, was wirklich bedeutungslos ist, da PHP dies sowieso tun wird.
Wenn Sie jedoch ein Skript haben, in dem die Verbindung nicht mehr benötigt wird, z. B. in der Mitte des Skripts, und dann andere schwere Aktivitäten stattfinden, ist es eine gute Idee, die Verbindung explizit zu schließen. Dadurch werden einige Ressourcen freigegeben.
Nun wurde viel über die Vorteile des Schließens einer Verbindung gesagt, aber fast nichts wurde über die Vorteile des Nichtschließens einer Verbindung gesagt. Wenn Sie die Verbindung am Ende eines Skripts nicht schließen, sparen Sie im Wesentlichen einige Ressourcen. Stellen Sie sich eine Webanwendung (oder eine beliebige Anwendung) vor, die 100 Seitenaufrufe pro Sekunde empfängt. Sie müssen also jede Sekunde mysqli_close100 Mal aufrufen - was bedeutet, dass Sie in jeder Sekunde 100 unnötige Roundtrips zum Datenbankserver haben, um die offenen Verbindungen zu schließen. Aus Sicht der Leistung ist dies reiner Overhead, da PHP nach Abschluss des Skripts ohnehin nach offenen Verbindungen sucht und diese Verbindungen schließt. Dies kann daran liegen, dass PHP nicht sieht, dass Sie Verbindungen haben, weil alles so schnell geschieht hat diese Verbindungen geschlossen und wird versuchen, sie wieder zu schließen.
Hinweis: In der obigen Antwort wird davon ausgegangen, dass Sie keine dauerhaften Verbindungen verwenden (dauerhafte Verbindungen werden in keinem der wichtigsten CMS verwendet).
Antworten:
Aus der Dokumentation :
Wenn Ihr Skript nach dem Abrufen des Ergebnisses ausreichend Verarbeitungsaufwand hat und die vollständige Ergebnismenge abgerufen hat, sollten Sie die Verbindung auf jeden Fall schließen. Wenn Sie dies nicht tun, besteht die Möglichkeit, dass der MySQL-Server sein Verbindungslimit erreicht, wenn der Webserver stark ausgelastet ist. Wenn Sie die MySQL-Verbindung erst gegen Ende des Skripts schließen können, ist dies sauberer, obwohl dies nicht explizit erforderlich ist.
Ich bin mir nicht sicher, wie Fastcgi die Dinge beeinflusst. Eine Seite behauptet, dass ein Build von PHP, der fastcgi unterstützt, dauerhafte Verbindungen schafft, selbst für mysql_connect. Dies widerspricht der Dokumentation dahingehend, dass die Verbindung geschlossen wird, wenn der Prozess und nicht das Skript endet. Anstatt es zu testen, empfehle ich die Verwendung von mysql_close (). Eigentlich empfehle ich die Verwendung von PDO , falls verfügbar.
quelle
"The link to the server will be closed as soon as the execution of the script ends."
Wenn der Benutzer eine Seite vorzeitig schließt, spielt dies keine Rolle für den PHP-Server. Es führt das Skript wie immer aus und beendet das Skript wie immer. Nur der Benutzer sieht kein Ergebnis.Ist es entscheidend? Nicht so viel
Wird es als eine gute Praxis angesehen, zu folgen? Ja.
Ich verstehe nicht, warum Sie es nicht schließen wollen.
quelle
mysql_close
"Die Verwendung von mysql_close () ist normalerweise nicht erforderlich, da nicht persistente offene Links am Ende der Skriptausführung automatisch geschlossen werden." Ich würde es nicht für eine schlechte Praxis halten, die Verbindung nicht zu schließen.Wenn Sie so etwas wie cgi verwenden, ist es völlig unnötig, Ihre MySQL-Verbindungen zu schließen, da diese am Ende der Skriptausführung automatisch geschlossen werden. Wenn Sie persistente Technologien wie mod_perl und andere verwenden, die Ihre Verbindungen zwischen Anforderungen aufrechterhalten, ist es wichtig, Verbindungen, globale Variablen usw. im Auge zu behalten.
Bereinigen Sie grundsätzlich für dauerhafte Daten nach sich selbst. Bei trivialen, nicht persistenten Daten verschwindet alles, wenn die Anforderung trotzdem abgeschlossen ist. In jedem Fall empfiehlt es sich, die Verbindungen immer zu schließen.
quelle
Wird geschlossen, sobald das Skript die Ausführung abgeschlossen hat. Es sei denn, Sie haben eine dauerhafte Verbindung hergestellt. Idealerweise sollten Sie eine Ressource (hier eine Verbindung) freigeben, sobald Sie damit fertig sind. Es sei denn, es besteht eine gute Chance, dass Sie es sehr bald bei der Ausführung wieder benötigen.
Verbindungspooling oder die Verwendung dauerhafter Verbindungen (wenn Sie dies gemeint haben) ist eine gute Idee, wenn Sie sich hinter einem einzelnen Datenbankserver befinden. Wenn jedoch mehr Server vorhanden sind und Sie einen Lastenausgleich durchführen, kann dies die Arbeitsverteilung beeinträchtigen. In der Regel führen einige Clients umfangreiche Abfragen aus, während andere leichtere Abfragen ausführen. Wenn also dieselbe Verbindung über n verwendet wird, sind einige Server stark ausgelastet, während andere nicht ausgelastet sind. Erwägen Sie die Verwendung kleinerer ttls und einer variablen Verbindungspoolgröße.
quelle
Die meisten CMS schließen die MySQL-Verbindung am Ende der Anfrage, was wirklich bedeutungslos ist, da PHP dies sowieso tun wird.
Wenn Sie jedoch ein Skript haben, in dem die Verbindung nicht mehr benötigt wird, z. B. in der Mitte des Skripts, und dann andere schwere Aktivitäten stattfinden, ist es eine gute Idee, die Verbindung explizit zu schließen. Dadurch werden einige Ressourcen freigegeben.
Nun wurde viel über die Vorteile des Schließens einer Verbindung gesagt, aber fast nichts wurde über die Vorteile des Nichtschließens einer Verbindung gesagt. Wenn Sie die Verbindung am Ende eines Skripts nicht schließen, sparen Sie im Wesentlichen einige Ressourcen. Stellen Sie sich eine Webanwendung (oder eine beliebige Anwendung) vor, die 100 Seitenaufrufe pro Sekunde empfängt. Sie müssen also jede Sekunde
mysqli_close
100 Mal aufrufen - was bedeutet, dass Sie in jeder Sekunde 100 unnötige Roundtrips zum Datenbankserver haben, um die offenen Verbindungen zu schließen. Aus Sicht der Leistung ist dies reiner Overhead, da PHP nach Abschluss des Skripts ohnehin nach offenen Verbindungen sucht und diese Verbindungen schließt. Dies kann daran liegen, dass PHP nicht sieht, dass Sie Verbindungen haben, weil alles so schnell geschieht hat diese Verbindungen geschlossen und wird versuchen, sie wieder zu schließen.Hinweis: In der obigen Antwort wird davon ausgegangen, dass Sie keine dauerhaften Verbindungen verwenden (dauerhafte Verbindungen werden in keinem der wichtigsten CMS verwendet).
quelle