Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL bestehende Verbindung verwenden?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL bestehende Verbindung verwenden?

    Hallo,

    ich habe ein einfaches php Script das alle paar Sekunden von verschiedenen IP´s augerufen wird. Dabei wird ein Datenbankzugriff erstellt und ein INSERT durchgeführt.

    Sekunden später das selbe. Jedesmal wird mir aber eine neue Datenbankverbindung erstellt welche dann auch einen Verbindungs Thread vorhält. So kommen schon mal 30 Verbindungen zu Stande die eigentlich nutzlos rumliegen bis ein Timeout sie wieder abschaltet.

    In einem Config.php File verbinde ich zur Datenbank
    PHP-Code:
    $connectid mysql_pconnect ($DBHost,$DBUName,$DBPasswort);
    if(
    mysql_errno()){
    exit; 
    }; 
    mysql_select_db($DBName,$connectid); 
    Dann in einem weiteren File binde ich das config.php ein und führe den INSERT aus:
    PHP-Code:
    include('config.php');

    $logeintrag "INSERT INTO log (datum) VALUE (now())";
    if (
    $ergebnis=mysql_query($logeintrag)){
    }; 
    Muss ich jetzt per mysql_close($connectid) die Datenbankverbindung wieder schließen? Dann macht er aber beim nächsten Connect wieder eine neu Verbindung auf. Ist es nicht sinnvoller eine Verbindung immer wieder zu verwenden? Aber wie stellt man das an? Die Anfragen kommen ja immer von verschiedenen Seitenbesuchern, also IP´s.

    Wie löst man das? Jede Datenbankverbindung gleich wieder schließen? Oder kann man eine bestehende Verbindung explizit wieder aufnehmen und damit weiterarbeiten?

    Besten Dank für Hilfe

    Christian

  • #2
    erm .. du hast falsche Vorstellungen von der Arbeitsweise von PHP auf dem Webserver - da rennt nicht dauerhaft eine Anwendung und hält dir zum Beispiel dauerhaft eine DatenbankVerbindung bereit - du MUSST jedesmal eine neue Verbindung bauen.

    Und diese Verbindung ist dann auch nicht offen bis zum Geht-nicht-mehr oder irgendeinem Time-Out , vielmehr wird die Verbindung automatisch geschlossen, wenn das PHP-script beendet ist

    der normale Ablauf ist dabei folgender

    durch den User wird im Webbrowser ein Request ausgelöst
    -> Request wird an Webserver geschickt
    --> Webserver startet für den Request einen neuen Worker-Thread
    ---> Worker "sieht" "da brauch ich PHP" und startet den PHP-Interpreter
    ----> PHP-Script wird abgearbeitet und dabei HTML-Antwort erstellt
    -----> Dabei Datenbank-Verbindung geöffnet
    ------> PHP-Script fertig , Antwort an Worker-Thread, DB-Verbindung zu
    -------> PHP beendet
    --------> Antwort an CLient
    ---------> Worker-Thread zu ...

    spätestens an der Stelle "..." weiß der Webserver nicht mal mehr, dass es Client XYZ gibt - wenn man nicht mit Session-Verwaltung was dagegen unternimmt - wegen der Requestbasierten Arbeitsweise gibt es aber auch deine "bestehende" Verbindung nicht

    Von daher solltest du nur innerhalb deines Scriptes darauf achten, dass nicht zig-Mal eine neue Datenbank-Verbindung angefordert wird.... einmal pro Sitzung ist aber quasi unumgänglich und auch problemlos

    Kommentar


    • #3
      So hab ich mir das ja auch vorgestellt. Dachte ich die letzten Jahre zumindest. Aber wenn ich mit die aktuellen Verbindungen meines MySQL Servers so ansehe (SHOW FULL PROZESSLIST), stehen da laufend schlafende Verbindungen von jenem Script drin. Ich habe auf dem Server auch noch einige TYPO3 und WordPress installationen drauf. Die erzeugen keine schlafenden Connections. Die TYPO3 Seite wird aufgerufen und danach ist die Verbindung nicht mehr zu sehen, fertig. Oder hällt MySQL immer einige Threads offen auch wenn Sie nicht benutzt werden und überschreibt dann bei Bedarf einen alten einfach?

      Christian

      Kommentar


      • #4
        mysql_pconnect <-- Dadurch werden deine Verbindungen aufrecht erhalten

        Kommentar


        • #5
          das deutet eher auf unsaubere Programmierung hin

          nach dem Muster:
          Code:
          $db=neue Verbindung 
          ..
          ..
          ..
          $db=neue Verbindung // ohne die alte zu schließen
          - bei diesem Konstrukt wird die zuerst erstellte Verbindung quasi "in der Ecke" stehen gelassen - und diese Verbindungen werden dann erst geschlossen, wenn der Garbage-Collector aufräumt. Dem kannst du abhelfen, indem du je nach verwendeter Datenbank-Erweiterung

          a) den NewLink-Parameter korrekt setzt (mysql_connect)
          b) mysql_pconnect

          schau mal nach "persistente" Verbindung ...

          Kommentar


          • #6
            Persistente Connections sind nicht unbedingt das Gelbe vom Ei, vor allem sind sie kein Patentrezept zur Leistungssteigerung... es kann sogar kontraproduktiv sein.

            http://php.net/manual/de/features.pe...onnections.php

            http://dev.mysql.com/doc/refman/5.5/...nnections.html

            Kommentar

            Lädt...
            X