James: Nach Ajax Request Datenbankverbindung aufrecht erhalten

Schönen Vormittag wünsch ich!

Ich war gerade an basteleien mit Ajax und PHP in Verbindung mit MySQL. Wenn ich Inhalte in ein DIV lade, muss ich jedes mal eine neue Verbindung zum MySQL Server aufbauen, also mysql_connect und mysql_select_db in die Dateien neu schreiben die ich einbinde, obwohl auf der Seite ja schon was offen ist. Meine Frage, gibt es da eine Möglichkeit ohne dass ich in jeder Datei eine Verbindung neu aufbauen muss?

Meine Gedankenansätze:
Das CSS und JS gilt trotz der Einbindung ja auch weiterhin global, und die Werte werden ja auch direkt übernommen. Daher habe ich mir überlegt, ob das nicht mit der MySQL Verbindung auch möglich ist.
Ich kann mir vorstellen, dass ja sozusagen eigentlich die PHP Datei schon geladen ist und daher die MySQL Verbindung trennt, weil ja erst danach der Request durch den Nutzer stattfindet, sich die anderen Sachen ja aber nicht schließen. Die Dateien bleiben halt eingebunden. Kann man das dennoch Ressourcenschonend umgehen?
Ich habe schon an mysql_pconnect gedacht, allerdings habe ich keinerlei Erfahrung wie ich damit richtig umgehe, damit es nicht zuviel Ressourcen zieht und gegenüber dem mysql_connect einen Vorteil besitzt. Soll ich lieber in jeder Datei eine neue Verbindung aufbauen oder habt ihr eine tolle Idee für mich?

Grüße,
James

  1. Hi,

    Ich war gerade an basteleien mit Ajax und PHP in Verbindung mit MySQL. Wenn ich Inhalte in ein DIV lade, muss ich jedes mal eine neue Verbindung zum MySQL Server aufbauen, also mysql_connect und mysql_select_db in die Dateien neu schreiben die ich einbinde, obwohl auf der Seite ja schon was offen ist.

    Eine „Seite“ ist ein clientseitiges imaginäres Konstrukt, das interessiert die beteiligten Techniken nicht.

    Fakt ist, dass du mit jedem AJAX-Request eine neue Scriptinstanz auf dem Server startest.

    Ich kann mir vorstellen, dass ja sozusagen eigentlich die PHP Datei schon geladen ist und daher die MySQL Verbindung trennt, weil ja erst danach der Request durch den Nutzer stattfindet, sich die anderen Sachen ja aber nicht schließen. Die Dateien bleiben halt eingebunden.

    JavaScript und CSS sind etwas vollkommen anderes als eine MySQL-Verbindung – dieser Vergleich hinkt also nicht, sondern er sitzt im Rollstuhl.

    Ich habe schon an mysql_pconnect gedacht, allerdings habe ich keinerlei Erfahrung wie ich damit richtig umgehe, damit es nicht zuviel Ressourcen zieht und gegenüber dem mysql_connect einen Vorteil besitzt. Soll ich lieber in jeder Datei eine neue Verbindung aufbauen oder habt ihr eine tolle Idee für mich?

    Was bringt dich denn überhaupt auf die Idee, für das bewährte Schema eine Alternative suchen zu müssen/wollen?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Was bringt dich denn überhaupt auf die Idee, für das bewährte Schema eine Alternative suchen zu müssen/wollen?

      Ich glaube, der liefert ernsthaft eine Seite ohne die (eigentlichen) Inhalte an den UserAgent aus, der dann mit Javascript weitere (XHR?)Requests auslösen soll, damit die Daten in die Webseite kommen.

      Was bringt dich denn überhaupt auf die Idee

      Ich glaube, es ist das Fehlen jedes Verständnisses dafür, was er sich da gerade aus diversen Beispielen zusammenkopiert. Fehlendes Grundlagenwissen also.

      Jörg Reinholz

      1. Ich bin hierher damit mir geholfen wird, nicht dass einer mich beleidigt und zwei hintendran die ihren Senf auch dazugeben möchten und eine Diskussion anfangen, weil es so toll ist einen Fragestellenden niederzumachen. Und dann noch Behauptungen "er hat sich was zusammenkopiert". Was hab ich mir denn hier zusammenkopiert? Den nicht vorhandenen Quellcode den ich anscheinend gepostet habe? Das war einfaches Brainstorming. Ohne eine Antwort kann ich schlecht anfangen etwas zu coden wovon ich keine Ahnung habe.
        Schoneinmal daran gedacht, dass hier hauptsächlich Anfänger ihre Fragen stellen und nicht Profis, was dieses Forum überflüssig machen würde? Dafür war das Forum doch gedacht?

        Ich kenne den Unterschied Client und Server. Sonst hätte ich keinen Satz darüber verloren, dass das Dokument schon geladen ist und daher keine Verbindung mehr auf ist. Meine Frage war, wie ich das umgehe, ob es eine Möglichkeit gibt, das aufrecht zu erhalten damit es so problemlos klappt wie CSS oder JS das die ganze Zeit global gilt, ob der "andere" Lösungsweg vorteilhaft ist oder nicht... Das war mein Gedanke, darauf wollte ich eine Antwort, weil es mich interessiert.

        Ich habe nichts gegen Besserwisserei, aber die muss man einem nicht in so einer Weise unter die Nase halten, dass es echt nicht mehr freundlich ist.

        Einen guten Tag.

        1. Hi,

          Ich kenne den Unterschied Client und Server. Sonst hätte ich keinen Satz darüber verloren, dass das Dokument schon geladen ist und daher keine Verbindung mehr auf ist. Meine Frage war, wie ich das umgehe,

          Persistente connections hast du doch schon entdeckt – was ist bei deinem Versuch, dich über deren Vor-/Nachteile zu informieren herausgekommen?

          ob es eine Möglichkeit gibt, das aufrecht zu erhalten damit es so problemlos klappt wie CSS oder JS das die ganze Zeit global gilt

          Das sind immer noch zwei so grundverschiedene Dinge, dass es keinen Sinn macht, sie in einen Topf zu werfen.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        2. Und dann noch Behauptungen "er hat sich was zusammenkopiert".

          Ein Satz, der mit "Ich glaube" beginnt, enthält keine Behauptung, sondern stets eine Meinung. Möglicherweise solltest Du Dich damit auseinandersetzen, dass Deine Fragestellung zu dem führt, was ich GLAUBE.

          Hier noch mal Deine Frage:

          Meine Frage war, wie ich das umgehe, ob es eine Möglichkeit gibt, das aufrecht zu erhalten damit es so problemlos klappt wie CSS oder JS das die ganze Zeit global gilt, ob der "andere" Lösungsweg vorteilhaft ist oder nicht

          CSS und JS sind nicht global, sondern vom Useragent geladen und werden beim Parsen beachtet(CSS) oder von einem Interpreter (im UserAgent!) interpretiert. Warum führst Du das auf, wenn es Dir um PHP <-> MySQL geht?

          Die erste Frage ist doch schon: Läuft PHP als CGI oder als Modul?

          Der Unterschied?

          IN EINFACHEN WORTEN:

          Wird PHP als CGI betrieben, dann ist die Reihenfolge die:

          • Request kommt beim Webserver an
          • Webserver stellt fest: Endung ist .php. Da soll ich den PHP-Interpreter starten und der soll das lästige Zeug anschauen. Der Webserver startet den PHP-Interpreter und gibt dem einen Haufen Daten mit auf den Weg.
          • Der PHP-Interpreter macht seinen Job, gibt dem Webserver die zu tätigenden Ausgaben zurück und BEENDET sich. Dazu meldet er natürlich alle Verbindungen zur Datenbank (und sonstwohin auch) ab.
          • Der Server schaut, ob sich PHP mit dem Status 0 (kein Fehler) verabschiedet hat, ergänzt die Daten um Headerzeilen und sendet den Kram ins Netz.

          Wer oder was sollte an dieser Stelle eine Verbindung zum MySQL-Server offenhalten?

          Wird PHP als Modul betrieben, dann ist die Reihenfolge die:

          • Request kommt beim Webserver an
          • Webserver stellt fest: Endung ist .php. Das soll ich dem mit mir gestartetem und auf sowas lauerndem PHP-Modul übergeben.
          • Das PHP-Modul macht seinen Job, gibt dem Webserver die zu tätigenden Ausgaben zurück und beendet sich NICHT.
          • Der Server ergänzt die Daten um die Header und sendet den Kram ins Netz.

          Hier kann also das PHP-Modul, dass dauerhaft läuft, die Verbundung zur Datenbank offen halten.

          (In der Realität ist das alles noch komplizierter, weil "der Webserver" ein Vaterprozess ist, der als eigentliche Bearbeiter der Requests einige Kindprozesse erzeugt und diese überwacht. Diese werden auch regelmäßig beendet.)

          Wenn also PHP als Modul läuft und Du auch in anderen Hinsichten (besonders mal: Anzahl der offenen Verbindungen zur Datenbank) mit mysql_pconnect leben kannst, dann weiß ich nicht, was Du noch fragst.

          Das obige ist Grundlagenwissen. Jedenfalls für jemanden, der in PHP programmiert. Und in dem Fall, dass Du behauptest "Das habe ich doch gewusst!" sage ich schon mal: Deine Fragen lassen diesen Schluss absolut nicht zu.

          Jörg Reinholz

  2. Tach!

    Ich war gerade an basteleien mit Ajax und PHP in Verbindung mit MySQL. Wenn ich Inhalte in ein DIV lade, muss ich jedes mal eine neue Verbindung zum MySQL Server aufbauen, also mysql_connect und mysql_select_db in die Dateien neu schreiben die ich einbinde, obwohl auf der Seite ja schon was offen ist. Meine Frage, gibt es da eine Möglichkeit ohne dass ich in jeder Datei eine Verbindung neu aufbauen muss?

    "Auf einer Seite" ist serverseitig nichts mehr offen. Der Server hat seine Arbeit getan, die Seite ausgeliefert und widmet sich nun neuen Request, ohne sich zu den alten irgendwas zu merken. Wenn der Browser was neues will, muss er einen neuen Request stellen. So zumindest funktioniert herkömmliches HTTP.

    Das CSS und JS gilt trotz der Einbindung ja auch weiterhin global, und die Werte werden ja auch direkt übernommen. Daher habe ich mir überlegt, ob das nicht mit der MySQL Verbindung auch möglich ist.

    Welche Werte werden wo übernommen? Und was genau hat die serverseitige MySQL-Verbindung mit den Client-Dingen deiner Meinung nach für eine Gemeinsamkeit?

    Ich kann mir vorstellen, dass ja sozusagen eigentlich die PHP Datei schon geladen ist und daher die MySQL Verbindung trennt, weil ja erst danach der Request durch den Nutzer stattfindet, sich die anderen Sachen ja aber nicht schließen. Die Dateien bleiben halt eingebunden. Kann man das dennoch Ressourcenschonend umgehen?

    Vermutlich musst du erstmal zwischen serverseitig und clientseitig unterscheiden lernen, und dass es ohne spezielle Maßnahmen keine stehende Verbindung zwischen beiden gibt.

    Ich habe schon an mysql_pconnect gedacht, allerdings habe ich keinerlei Erfahrung wie ich damit richtig umgehe, damit es nicht zuviel Ressourcen zieht und gegenüber dem mysql_connect einen Vorteil besitzt. Soll ich lieber in jeder Datei eine neue Verbindung aufbauen oder habt ihr eine tolle Idee für mich?

    Was für ein Problem mit dem Verbindungaufbau hast du denn? Ist es ein echtes, nachgemessenes, oder ist es nur ein Bauchgefühl?

    Wie bekommt man aber eine dauerhafte Verbindung hin? Die HTTP-Verbindung offenzuhalten, ist nur eine Einweg-Kommunikation (in Richtung Client) und auch mit Nachteilen wie dem Timeout verbunden. Websockets ist hingegen eine Technik, die für eine bidirektionale Verbindung vorgesehen ist. Ich denke aber nicht, dass du dir den Aufwand antun solltest, denn mir scheint dein Problem nur ein Pseudoproblem zu sein, für das du eigentlich keine Lösung brauchst. Der MySQL-Verbindungsaufbau ist dafür konzipiert, dass er sehr oft in kurzer Zeit ausgeführt werden kann.

    dedlfix.