PHP Chat reload?

6 Antworten

das macht man so nicht, des macht man mit AJAX . der rest ist und bleibt unfug .

und dann pullst du alle sekunde nach neuigkeiten , oder kürzer .

hier mal etwas was einfach geht

https://easycodeshare.com/php-ajax-live-chat-example-for-single-chat-room/

oder einer in deutsch mit login

https://code.tutsplus.com/de/tutorials/how-to-create-a-simple-web-based-chat-application--net-5931

MrCommandBlock  19.03.2022, 22:22

das pullen erzeugt unnötig massive Server und Traffic ressourcen. (Besonders bei "alle sekunde [...] oder kürzer"

Besser wäre Long Polling oder WebSockets.

0
Von Experte MrCommandBlock bestätigt

Bei einem Chat mit PHP wäre wohl long polling eine der sinnvollsten Strategien. Das heißt, du öffnest mit JavaScript einen Kanal zum Server (Request), die von diesem dann etwas länger offen gehalten wird. Wenn die Verbindung bspw. aufgrund der zu langen Wartezeit (oder dem gesendeten Response) abbricht, wird sie neu hergestellt.

Eine JavaScript-Funktion dafür könnte ungefähr so aussehen:

async function waitForNews() {
  let response = await fetch("URL to PHP script ...");

  switch (response.status) {
    case 200:
      const message = await response.text();
      // add message to chat listing ...
      await waitForNews();
      break;
    case 502: // connection timeout
      await waitForNews();
      break;
    default:
      console.err(response.statusText);
      setTimeout(async function() {
        await waitForNews();
      }, 1000);
  }
}

Auf Serverseite wiederum kann eine Schleife so lange ausgeführt werden, bis es eine neue Nachricht gibt. Einmal vereinfacht gezeigt:

<?php
  while (true) {
    $news = checkForNews();

    if ($news) {
      print $news;
      break;
    }
  }

Die neuen Nachrichten sollten in einem einfach lesbaren Format (z.B. JSON) ausgegeben werden. So kannst du sie im JavaScript-Teil leicht verarbeiten und anschließend via DOM API in dein HTML-Dokument hängen.

Dazu nur ein einfaches Beispiel:

<ul id="listing"></ul>
<script>
  const listing = document.getElementById("listing");
  const li = document.createElement("li");
  li.textContent = "Hello";
  listing.appendChild(li);
</script>

Weitere Informationen zur Manipulation des DOM findest du bspw. auf MediaEvent oder MDN.

Mats4411 
Fragesteller
 20.03.2022, 22:49

Geht das auch mit purem php? Ich habe mir vorgenommen, die Seite ohne JS zu machen, da man das ja ausstellen kann...

0
regex9  20.03.2022, 23:39
@Mats4411

Nein. Der Server reagiert nur auf Anfragen vom Browser. Er kann von sich aus nicht ein Neuladen der Seite triggern. Auch eine temporäre Speicherung der eingegebenen Daten würde JavaScript erfordern.

Auf Nutzer, die JavaScript ausschalten, kannst du mit einem noscript-Block reagieren:

<noscript>Um den Chat nutzen zu können, muss JavaScript aktiviert sein.</noscript>
0

ich hatte mich vor Jahren mal mit diesem Problem befasst.

Meine Lösung bestand in einem Frameset bei dem die Editorseite und der Parent eben nicht ständig neu geladen wurden.

Du hast aber noch ein weiteres Problem - die meisten Provider lassen keinen Chat-Betrieb zu (wegen dem Trafic).

  • Long Polling - Bronze
  • AJAX - Silber
  • WebSockets - Gold

Die LongPolling und Ajax methoden wurden ja schon vorgeschlagen, am straightesten wäre aber sicherlich eine Websockets Lösung.

Die ist aber mit der Implementierung am schwirigsten, vorallem in plain PHP ohne Framework.

Woher ich das weiß:Hobby – Programmiere seit 2017 Webapplikationen

Indem du nicht alle 10 Sekunden die Seite neu lädst.. das ist absoluter Quatsch. So macht man das nicht, bei keinem Chat.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium
Mats4411 
Fragesteller
 19.03.2022, 21:44

Ja, dann hat man aber auch keine neuen Nachrichten...

0
triopasi  19.03.2022, 21:46
@Mats4411

Hast du mal was von JavaScript gehört? Oder gar WebSockets?

0