Pit: Chat in PHP selber mal programmieren

Hallo,

es gibt ja verschiedene Möglichkeiten um in PHP einen Chat zu programmieren, mir bekannt, hoffentlich lieg' ich richtig, Socket-Funktionen, Shared Memory-funktionen und Queues-Funktionen.

Vielleicht hat ja jemand schon von Euch so seine Erfahrungen.

Gruß Pit

  1. Hallo Pit,

    es gibt ja verschiedene Möglichkeiten um in PHP einen Chat
    zu programmieren,

    Ja, auch in PHP gibt es verschiedene Moeglichkeiten, einen
    Chat zu realisieren ;)

    mir bekannt, hoffentlich lieg' ich richtig,
    Socket-Funktionen, Shared Memory-funktionen und
    Queues-Funktionen.

    Du hast hier verschiedene Mittel zur IPC (Inter Process
    Communication) genannt. Aber mit denen kann man keinen Chat
    programmieren. Sicher, man kann sie zur Hilfe nehmen, um
    die Chat-Prozesse und den Datenbestand zu synchronisieren,
    aber das hat wenig mit dem Chat selber zu tun.

    Vielleicht hat ja jemand schon von Euch so seine
    Erfahrungen.

    Dieses Forum hier ist im Grunde ein 'Chat'. Die Threads sind
    verschiedene 'Raeume', die Threads sind die Nachrichten. Im
    Hintergrund laeuft ein Server, der alles verwaltet. Man muss
    einmal das Prinzip von konkurrierenden Prozessen (sei es nun
    in Thread-Form, sei es nun als wirklich verschiedene
    Prozesse) verstanden haben, dann ist es eigentlich relativ
    einfach. Welches Mittel du jetzt einsetzt ist letztenendes
    egal. Du musst es nur wirklich verstanden haben. Gerade bei
    PHP-Programmierern (das liegt wohl aber weniger an der
    Sprache PHP als viel mehr an dem Clientel) habe ich oft
    bemerkt, dass sie eigentlich gar nicht verstehen, was sie da
    tun. Und *das* ist bei einem Thema wie IPC toedlich.

    Gruesse,
     CK

    1. Moin!

      es gibt ja verschiedene Möglichkeiten um in PHP einen Chat
      zu programmieren,

      Ja, auch in PHP gibt es verschiedene Moeglichkeiten, einen
      Chat zu realisieren ;)

      Allerdings ist das zugrundeliegende Protokoll HTTP für einen Chat das ungeeignetste Protokoll, was es gibt. Wenn man aber vernünftige Chat-Protokolle wie IRC benutzt, kann man PHP leider wegwerfen, weil es eben für HTTP erfunden wurde. Die Tatsache, dass PHP sogar IRC-Funktionen mitbringt (die leider einen speziellen Webserver erfordern, der nicht Apache heißt), bedeutet nicht, dass sich HTTP im Allgemeinen und PHP im besonderen für einen Chat eignen.

      mir bekannt, hoffentlich lieg' ich richtig,
      Socket-Funktionen, Shared Memory-funktionen und
      Queues-Funktionen.

      Du hast hier verschiedene Mittel zur IPC (Inter Process
      Communication) genannt. Aber mit denen kann man keinen Chat
      programmieren. Sicher, man kann sie zur Hilfe nehmen, um
      die Chat-Prozesse und den Datenbestand zu synchronisieren,
      aber das hat wenig mit dem Chat selber zu tun.

      Ich hab unlängst einen Chat geschrieben, der seine  Kommunikation über eine MySQL-Datenbank abwickelt. Aber das Teil ist grausam, weil das Funktionsprinzip grausam ist. Man muß zwingend Frames einsetzen, und man muß ständig das Chatfenster neu laden, was auch dann, wenn niemand etwas sagt, zu ständigem Traffic führt. Über das Verhalten unter Last will ich lieber mal gar nicht spekulieren. Meine Anwendung war ausschließlich für parallele 1:1-Gespräche vorgesehen, da sind die Verhältnisse noch recht übersichtlich. Und es wurde mit maximal zwei parallelen Gesprächen getestet (als Machbarkeitsstudie innerhalb eines größeren Systems also tolerierbar ;) ).

      --
      - Sven Rautenberg
      1. Hallo Sven,

        Allerdings ist das zugrundeliegende Protokoll HTTP für
        einen Chat das ungeeignetste Protokoll, was es gibt.

        Richtig.

        Wenn man aber vernünftige Chat-Protokolle wie IRC benutzt,
        kann man PHP leider wegwerfen, weil es eben für HTTP
        erfunden wurde.

        Nicht richtig :)
        PHP kann man durchaus auch ausserhalb des Internets anwenden.
        Ist zwar sehr umstaendlich, aber es geht.

        Ich hab unlängst einen Chat geschrieben, der seine
        Kommunikation über eine MySQL-Datenbank abwickelt.

        Warum machst du sowas?! *schuettel* Selbst fuer einen
        HTTP-basierten Chat gibt es sinnvollere Ansaetze. Man muss
        doch nicht *alles* in eine Datenbank packen.

        Gruesse,
         CK

        1. Moin!

          Wenn man aber vernünftige Chat-Protokolle wie IRC benutzt,
          kann man PHP leider wegwerfen, weil es eben für HTTP
          erfunden wurde.

          Nicht richtig :)
          PHP kann man durchaus auch ausserhalb des Internets anwenden.
          Ist zwar sehr umstaendlich, aber es geht.

          _Erfunden_ wurde PHP für HTTP. Dass man es auch für andere Dinge verwenden kann, stellt diese Aussage ja gar nicht in Abrede. :)

          Ich hab unlängst einen Chat geschrieben, der seine
          Kommunikation über eine MySQL-Datenbank abwickelt.

          Warum machst du sowas?! *schuettel* Selbst fuer einen
          HTTP-basierten Chat gibt es sinnvollere Ansaetze. Man muss
          doch nicht *alles* in eine Datenbank packen.

          1. Die Datenbank war schon da und wurde ohnehin verwandt.
          2. Es ging lediglich um eine Machbarkeitsstudie (proof-of-concept)
          3. Ich hatte und hätte auch heute noch keine Idee, wie ich mal eben einen Server-Daemon in PHP hätte erstellen können - außerdem wollte ich mit dem Ding auch irgendwann mal fertig werden. Und da nehme ich dann lieber das, was ich kann und was funktioniert, als dass ich mich in entwicklungstechnische Abenteuer stürze, für die ich keine Zeit habe. Ja, das Leben ist hart. :)

          --

           - Sven Rautenberg
          1. Hallo Sven,

            _Erfunden_ wurde PHP für HTTP.

            Na gut. :)

            1. Die Datenbank war schon da und wurde ohnehin verwandt.

            Na und?

            1. Es ging lediglich um eine Machbarkeitsstudie
              (proof-of-concept)

            Keine Ausrede

            1. Ich hatte und hätte auch heute noch keine Idee, wie ich
              mal eben einen Server-Daemon in PHP hätte erstellen können

            Das musst du ja gar nicht.

            Und da nehme ich dann lieber das, was ich kann und was
            funktioniert, als dass ich mich in entwicklungstechnische
            Abenteuer stürze, für die ich keine Zeit habe. Ja, das
            Leben ist hart. :)

            Und eine einfache Datei mit den Beitraegen haette es nicht
            getan? Texte in eine DB, dann auch noch eine *MySQL*-DB, die
            bekannterweise bei vielen schreibenden Zugriffen Probleme
            bekommt. Bei jedem Script-Aufruf (und die sind bei einem Chat
            normalerweise sehr haeufig) ein Datenbank-Connect, dazu ein
            Select... oh man.

            Gruesse,
             CK

            1. Moin!

              Und da nehme ich dann lieber das, was ich kann und was
              funktioniert, als dass ich mich in entwicklungstechnische
              Abenteuer stürze, für die ich keine Zeit habe. Ja, das
              Leben ist hart. :)

              Und eine einfache Datei mit den Beitraegen haette es nicht
              getan? Texte in eine DB, dann auch noch eine *MySQL*-DB, die
              bekannterweise bei vielen schreibenden Zugriffen Probleme
              bekommt. Bei jedem Script-Aufruf (und die sind bei einem Chat
              normalerweise sehr haeufig) ein Datenbank-Connect, dazu ein
              Select... oh man.

              Dass der Implementation eine gewisse Schönheit abgeht, bestreite ich ja gar nicht. Aber ich hatte unter wenig mehr als Null-Last auf einem Pentium 166 MMX keine MySQL-Probleme, und zu Demonstrations- und Forschungszwecken, bei denen es nicht primär um den Chat ging, reichte mir das.

              --

               - Sven Rautenberg
          2. Hallo!

            _Erfunden_ wurde PHP für HTTP. Dass man es auch für andere Dinge verwenden kann, stellt diese Aussage ja gar nicht in Abrede. :)

            Wenn ich nicht irre wurde PERL als "Erweiterung" für BASH erfunden, und guck was heute damit gemacht wird!

            Grüße
            Andreas

      2. Hi Sven,

        Ich hab unlängst einen Chat geschrieben, der seine  Kommunikation über eine MySQL-Datenbank abwickelt. Aber das Teil ist grausam, weil das Funktionsprinzip grausam ist.

        kann ich den Chat erreichen?

        Man muß zwingend Frames einsetzen,

        warum?

        und man muß ständig das Chatfenster neu laden, was auch dann, wenn niemand etwas sagt, zu ständigem Traffic führt. Über das Verhalten unter Last will ich lieber mal gar nicht spekulieren. Meine Anwendung war ausschließlich für parallele 1:1-Gespräche vorgesehen, da sind die Verhältnisse noch recht übersichtlich. Und es wurde mit maximal zwei parallelen Gesprächen getestet (als Machbarkeitsstudie innerhalb eines größeren Systems also tolerierbar ;) ).

        Gruss,
        Lude

        1. Moin!

          Ich hab unlängst einen Chat geschrieben, der seine  Kommunikation über eine MySQL-Datenbank abwickelt. Aber das Teil ist grausam, weil das Funktionsprinzip grausam ist.

          kann ich den Chat erreichen?

          Man muß zwingend Frames einsetzen,

          warum?

          Ok, man kann auch zwei Browserfenster aufmachen. Das ist aber fast dasselbe. :)

          Erklärung:
          Der Browsernutzer will üblicherweise relativ zeitnah und vor allem ohne eigene Aktivität die Chat-Äußerungen der anderen Teilnehmer sehen. Zu diesem Zweck ist es notwendig, die Anzeige mit den letzten Äußerungen regelmäßig zu aktualisieren.

          Die einzige vernünftig arbeitende Methode dafür ist, in regelmäßigen Abständen die Anzeigeseite neu zu laden. Das geht wahlweise über entsprechende HTTP-Header oder deren Äquivalent in Meta-Tags (Refresh).

          Wenn man aber nur ein einziges Browserfenster benutzt, muß zwingenderweise das Eingabefeld für eigene Äußerungen ebenfalls auf dieser Seite untergebracht sein. Wenn man aber unglücklicherweise seinen Satz nur halb eingetippt hat, und die Seite lädt sich neu, bevor man ihn abgeschickt hat, dann ist die Eingabe futsch.

          Einzige Lösung: Die zwei Seitenteile in Frames packen.

          Zugegeben: Man könnte mit einem aufwendigen Drumherum an Javascript sicherlich noch einiges retten. Beispielsweise onunload die bisherige Eingabe in den Fensternamen retten und onload auf der erneuerten Seite wieder ins Feld hineinschreiben. Aber das halte ich beides für äußerst fragwürdig, zumal man ja üblicherweise auf Javascript nicht zwingend vetrauen darf (jedenfalls war das eine Bedingung bei meiner Entwicklung).

          --

           - Sven Rautenberg
          1. Hi!

            Die einzige vernünftig arbeitende Methode dafür ist, in regelmäßigen Abständen die Anzeigeseite neu zu laden. Das geht wahlweise über entsprechende HTTP-Header oder deren Äquivalent in Meta-Tags (Refresh).

            Das ist eine abartige Methode, die mich davon bisher abgehalten hat. Ich überlege zwischen 2 Varianten, entweder Flash, udn hier über XML-Sockets(Flash-Datei stell teine eigene persistente Socket-Verbindung her), oder Java, das sollte erheblich besser gehen, aber da habe ich  noch keine Ahnung von. auch wenn man Flash nicht mag, es hat eh fast jeder, und alles hat Vor- und Nachteile, nur ist die Refresh-Lösing IMHO keine wirkliche _Lösung_!

          2. Ich hab unlängst einen Chat geschrieben, der seine  Kommunikation über eine MySQL-Datenbank abwickelt. Aber das Teil ist grausam, weil das Funktionsprinzip grausam ist.

            kann ich den Chat erreichen?

            Hi Sven,

            klar, der Chatter will auch chatten. Danke für die Erläuterungen. - Kann ich den Chat irgendwo begutachten?

            Gruss,
            Lude

            1. Moin!

              klar, der Chatter will auch chatten. Danke für die Erläuterungen. - Kann ich den Chat irgendwo begutachten?

              Nein, der ist nie veröffentlicht worden, sondern liegt auf meinem privaten Entwicklungsserver. Und er wird besser auch nicht veröffentlicht. ;)

              --

               - Sven Rautenberg
          3. Hallo Sven,

            Die einzige vernünftig arbeitende Methode dafür ist, in regelmäßigen Abständen die Anzeigeseite neu zu laden. Das geht wahlweise über entsprechende HTTP-Header oder deren Äquivalent in Meta-Tags (Refresh).

            Vernünftig ist die Methode schon mal gar nicht. ;)
            Aber folgende auch nicht (welche sonst immer verwendet wird): Das PHP-Script für die Ausgabe hört einfach nicht aus, auszugeben und läuft in einer Endlosschleife ab. Klar, das ist auch blöd und überhaupt nicht im Sinne von HTTP, aber immerhin wengier Traffic-Lastig wie Deine Variante. Das wird leider im Buch Webanwendungen mit PHP 4.0 entwickeln von Tobias Ratschiller und Till Gerken als "üblicher Trick, den Sie kennen sollten" beschrieben. (no comment *g*)

            Grüße,

            Christian

            --
            Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                                  -- Albert Einstein