wozu mysql_close()?

Hallo,
ich frage mich schon seit längerem wozu es die PHP Function mysql_close() gibt.
Geht es nur um die Schönheit und um sauberen Code oder hat es auch irgendwelche anderen Vorteile von denen ich nichts weiss?

Ich hoffe mir kann geholfen werden,
Gruß MorbZ
 
Wenn du kein mysql_close() machst, dann bleibt beim Server die Verbindung zum Client immer noch offen, selbst wenn der Client schon geschlossen wurde. Bei einer Seite mit 5 Zugriffen/Tag ist das wohl ziemlich egal, stell dir das allerdings hier im Forum oder gar bei großen Seiten á la amazon vor, da würden die Server reihenweise krepieren weil keine Bandbreite mehr zur Verfügung steht weil immer noch Pipelines offen sind die nicht mehr genutzt werden. Sicher geht es auch um schönen Code, aber gerade wenn das keine Pimperlseite ist oder der Server sowieso schon schwach ist, dann braucht man das unbedingt.

Edit: Nach einer Zeit wird natürlich vom Server aus die Verbindung getrennt, das kann aber ne halbe Std sein. Und in der Zeit wird nur die Servergeschwindigkeit (unnötig) minimiert
 
Der Befehl schließ ja die Verbindung zum MYSQL-Server.
Aber wenn nicht-persistente Verbindungen genutzt werden, werden alle Datenbankverbindungen am Ende des Scriptes automatisch geschlossen.
Vielleicht ist der Befehl dann ganz nützlich, wenn das Script keine richtige Fehlerbehandlung hat und einer Endlosschleife zum Opfer wird, dann besteht die Verbindung zur Datenbank weiter. :D
Das würde zwar nicht unbedingt so oft vorkommen, aber ich denke mal das der Befehl eingefügt wird hat Gründe für die Sicherheit, damit Niemand so richtig an die Datenbestände der Datenbank rankommt, falls an einer anderen Stelle im Script eine Sicherheitslücke gibt.
Ich selbst weiß nicht unbedingt, wie es mit der Sicherheit von PHP aussieht, aber ich denke mal schon das man sich in PHP-Scripts irgendwie reinmogeln kann und Schaden anrichten kann oder sensible Daten erhaschen könnte. Den Gedanke habe ich aber nur, da ich weiß das es Leute gibt und Themen die sich mit der Sicherheit von PHP und SQL auseinandersetzen.
Wie es genauer aussieht, kann dir sicher einer von unseren SQL- oder PHP- Gurus sagen.

@RemoteC
Falsch, die Verbindung zum Server wird gekappt wenn das Script zuende ist.
 
Original von Prometheus
@RemoteC
Falsch, die Verbindung zum Server wird gekappt wenn das Script zuende ist.
Noch ein Grund meinen (unfähigen) Softwareengineering Professor zu hassen, er hat das nämlich so erzählt. Und wenn man kein sql_close() macht, dann bleibt die Verbindung so lange bestehen wie das in den Settings vom Server drinnen steht -.-

Und ich dachte schon, er hätte einmal etwas sinnvolles gesagt und ich habe mir das auch noch gemerkt :rolleyes:
 
Original von RemoteC
Original von Prometheus
@RemoteC
Falsch, die Verbindung zum Server wird gekappt wenn das Script zuende ist.
Noch ein Grund meinen (unfähigen) Softwareengineering Professor zu hassen, er hat das nämlich so erzählt. Und wenn man kein sql_close() macht, dann bleibt die Verbindung so lange bestehen wie das in den Settings vom Server drinnen steht -.-

Und ich dachte schon, er hätte einmal etwas sinnvolles gesagt und ich habe mir das auch noch gemerkt :rolleyes:

Also in meinem Buch von mitp steht es jedenfalls so drin:
"Wenn nicht-persistente Verbindungen genutzt werden, werden alle Datenbankverbindungen am Ende des Scripts automatisch geschlossen. Der Aufruf von myssql_close() ist dann nicht notwendig."
Ich verstehe das so, das es im Prinzip keine persistente Verbindungen gibt, denn da müsste man mit den Daten ständig arbeiten müssen und folglich noch das Script laufen muss um das zu gewährleisten.

Aber wenn dir das ein Prof. erzählt hat, muss das schon irgendwie auf der einen Seite stimmen.
Warten wir einfach mal unsere PHP und SQL - Gurus ab. :D
 
Hehe, es lebe GuruTFM! ;)

..aber ich muss zugeben, ich wusste das auch nicht mehr - obwohl ichs extra mal nachgelesen hatte, weil ich mir dieselbe Frage gestellt hatte.. :)
 
mysql_close() bringt nur was, bei scripten in denen irgentwann keine Datenbank abfragen stattfinden.

z.b. ein gaestebuch, alle daten holen, verbindung schließen und erst dann die daten aus der DB verarbeiten.
so spart man bei vielen besuchern (aber auch nur dann) bandbreite und man kann natürlich seine scripte auch auf geschwindigkeit optimieren.

andere gruende waeren mir unbekannt.

mfg
coderinblack
 
coderinblack:
Sprichst du vom Caching von DB-Abfragen? Ansonsten wüsste ich nicht, wo darin die Optimierung von Skripten liegen könnte, geschweige denn eine Einsparung von Bandbreite (zumal das DBMS in den meisten Fällen auf dem localhost liegt). Und bei einem selbst gebastelten Cache spielt es dann auch keine Rolle, ob da irgendwo ein mysql_close() drin steht :)

Prometheus:
Da sind wir aber immer noch nicht weiter, das was du hier geschrieben hast habe ich auch schon festgestellt.
Den PHP-Entwicklern und -Dokuschreibern würde ich mal eher vertrauen als RemoteCs Prof, darum ging es mir. Was willst du denn noch dazu wissen, was dich "weiterbringen" würde? ;)
 
Vielleicht, überlegt ihr mal welche Vorteile es hat eine ungenutzte Datenbankverbindung
bis zum Ende des Skriptes offenzulassen?
Ausser Schonung der Tastatur fällt mir keiner ein.
Ansonsten sehe ich offene Verbindungen immer als Risiko.

Gruss
 
Original von end4win
Vielleicht, überlegt ihr mal welche Vorteile es hat eine ungenutzte Datenbankverbindung
bis zum Ende des Skriptes offenzulassen?
Ausser Schonung der Tastatur fällt mir keiner ein.
Das wären schonmal mehr Vor- als Nachteile ;)

Es mag für ein einzelnes Skript mit einer Abfrage deutlich sein, dass danach nix mehr kommt. Aber bei größeren Projekten kann man nicht bei jeder Abfrage mit Sicherheit sagen, dass dies in jedem Fall die letzte sein wird. Und vor jeder Datenbankabfrage eine Verbindung zu öffnen und sie danach wieder zu schließen ist auch nicht gerade performant.

Eine Sicherheitslücke ist eine offene Datenbankverbindung jedenfalls nicht. Sicherheitsrelevant wird es erst dann, wenn die Verbindung auch genutzt wird, und darauf muss man so oder so achten.
 
Sicherheitsrelevant wird es erst dann, wenn die Verbindung auch genutzt wird, und darauf muss man so oder so achten.Sicherheitsrelevant wird es erst dann, wenn die Verbindung auch genutzt wird, und darauf muss man so oder so achten.
1. Nachteil, es ist ein Risiko, da die offene Verbindung auch von einem Angreifer genutzt werden kann.
2. Nachteil: ein erneutes mysql_connect() im Skript nutzt nicht die offene Verbindung, sondern stellt eine neue Verbindung her!
Gerade bei grossen Projekten, wo unter Umständen auch noch mit unterschiedlichen Rechten auf Datenbanken zugegriffen wird, sind dann mehrere Verbindungen offen.

;) Jetzt hast du mehr Nachteile, wie Vorteile!

btw. Ich weiss auch bei meinen grösseren Skripten wann keine Datenbankverbindung mehr
nötig ist. Da steht dann immer mysql_close() :D

Gruss
 
Original von end4win
1. Nachteil, es ist ein Risiko, da die offene Verbindung auch von einem Angreifer genutzt werden kann.
Wie klaut ein Angreifer eine offene Datenbankanbindung zum localhost? Wenn er Zugriff auf die Scripte selbst hat, kann er auch problemlos eine neue Verbindung öffnen, wenn er zwischen Skript- und DB-Server hockt, liegt ein viel gravierenderes Sicherheitsrisiko vor ;)

2. Nachteil: ein erneutes mysql_connect() im Skript nutzt nicht die offene Verbindung, sondern stellt eine neue Verbindung her!
Richtig, aber du bräuchtest dann jederzeit ein mysql_connect(), wenn du auf die Datenbank zugreifen möchtest, anstatt einfach zu Beginn der Datenbankinitialisierung eine Verbindung zu öffnen und dann mit mysql_query() beliebig viele Abfragen zu starten. Über den Performanceunterschied zwischen sagen wir 100 Abfragen am Stück in der gleichen Verbindung und 100 Abfragen in ebensovielen verschiedenen Verbindungen, müssen wir uns glaub ich nicht unterhalten.

btw. Ich weiss auch bei meinen grösseren Skripten wann keine Datenbankverbindung mehr
nötig ist.
Das kommt dann wohl auf die Art des Projektes an. Wie gesagt, für ein popliges Gästebuch o.ä., wo an einer einzelnen Stelle einfach alles aus der Datenbank ausgelesen wird und danach nix weiter passiert, spielt das keine Rolle. Aber wenn die aus der DB ausgelesenen Inhalte wiederum als Bedingungen für weitere Abfragen gelten, dann wird das schnell sehr unübersichtlich.

Aber nunja, jeder nach seiner façon. Ab einer bestimmten Projektgröße sollte man lieber sowieso auf Datenbankabstraktionen wie DB::QueryTool aus PEAR o.ä. zurückgreifen ;)
 
sieh es mal so: du hast ein großes script, dieses holt sich die daten und schließt dann die verbindung. Die Daten werden aufwendig weiter verarbeitet, das ganze dauert eine sekunde.
nun hast du z.b. 60 Aufrufe pro sekunde auf der seite, das würde dann 60 offene verbindungen machen. Ich hab schon fälle gesehen wo aber schon nach 10 verbindungen dicht gemacht wird. Wenn nun nach dem Holen der Daten (für das beispiel mal 0.1sek angenommen) die Verbindung geschlossen wird so hast du nur noch durchschnittlich 6 offene verbindungen, was dir in die richtung etwas mehr platz verschafft.
 
Zurück
Oben