persistente datenbankverbindung verhindern

Lord_Icon

Member
Hi,

gibt es eine Möglichkeit (z.b. über die vhost) persistente datenbankverbindung zu verhindern?
Bzw. generell eingriff nehmen. Z.b. Wie lange soll eine Verbindung offen gehalten werden. Normal sind glaube ich 10min.

Gibt es irgendwelche Möglichkeiten, hier pro User einzugreifen ?

Über die vhost wäre das ne super Regelung. Aber ich habe darüber noch nichts gefunden... drum gehe ich mal davon aus, dass dies nicht geht (?)
 
So sollte es im ideal Fall laufen. Keine Frage.

Aber nicht jedes Script respektive User hält sich dran.
Manchmal ist es auch garnicht anders möglich... zB. bei JS-Einsatz.
oder oder oder...

War halt ne generelle Frage.
 
Du kannst über die Berechtigungen pro Benutzer die maximale Anzahl an gleichzeitigen Verbindungen einschränken - falls es tatsächlich Probleme damit gibt dass der Server zigtausend offene Verbindungen hat auf denen nichts passiert.
In der Regel sterben die Verbindungen aber zusammen mit den jeweiligen Prozessen/Threads des HTTP-Servers und verschwinden daher nach einer gewissen Zeit von selbst.

Persistente Verbindungen sind generell auch nichts schlimmes, immerhin spart man sich den ganzen Overhead mit TCP-Handshake, Authentifizierung etc...
 
Alle heutigen Frameworks und MySQL-Klassen nutzen bevorzugt pconnect. Daher ist es mit "ordnungsgemäss am Ende der Session schliessen" nicht getan.

Das Problem über die MySQL-Berechtigungen anzugehen, halte ich für kritisch. Es kann zu Fehlerseiten kommen obwohl es ungenutzte Connections gibt, die lediglich mit anderen Apache-Childs verbunden sind.

Daher nun Tipps aus der Praxis:
Natürlich muss man die Nutzung von FastCGI und modPHP differenzieren. Während FastCGI kürzere Prozesszyklen hat, kann mod_PHP recht lange im Speicher verweilen.
1.) Bei mod_php kann MaxRequestsPerChild und MaxSpareServers dienlich sein, um PHP-Leichen vom Apache her schneller zu entsorgen.
2.) Längere ruhende Verbindungen können von MySQL beendet werden. Der my.cnf-Parameter "wait_timeout" gibt in Sekunden an, ab wann diese Verbindungen beendet werden wenn dort nichts mehr passiert.
3.) Auch für die php.ini gibt es Parameter: mysql.allow_persistent (bool) oder mysql.max_persistent (Anzahl). (Falls auch/zusätzlich mysqli verwendet wird, gibt es die selben Werte nochmal mit dem i.)
Dies erlaubt die Nutzung von persistenten Verbindungen bzw. kann sie auf wenige Connections einschränken.

Gerade mit dem Tipp 3 kann man das Problem pro Vhost regeln indem man die Parameter in die VirtualHost schreibt (für mod_php) oder in die jeweilige php.ini (für FastCGI).

huschi.
 
Wer in Kundenhosting-systemen auf mod_php setzt sollte auch den ganzen Weg gehen und mpm_itk verwenden. Das löst das genannte Problem übrigens von selbst da der Prozess am Ende der Ausführung zwangsweise beendet und somit die Verbindung zu Mysql freigegeben wird.

Zumindest bei mod_php kann man übrigens mit folgendem Befehl in den vHosts(!) persistent blockieren:
php_admin_flag mysql.allow_persistent off
php_admin_flag mysqli.allow_persistent off
 
Wenn es per vhost auf off gesetzt ist.
Was passiert denn dann im Script, wenn dort doch per mysql_pconnect ne Verbindung aufgebaut wird ?
Wenn diese function dann nicht mehr zugelassen wird, dann funzen ja einige Programme nicht mehr.
Oder wird akzeptiert und am ende des scriptes zwangsbeendet ?

Danke
 
Ich musste jetzt kurz mal nachschauen, bevor ich ein RTFM absetzte. Aber es steht tatsächlich nicht drin. :eek:
mysql_pconnect ruft in dem Fall mysql_connect() auf. Es gibt also einen automatischen Fallback.

huschi.
 
Back
Top