PHP Chat reload?
Hallo ihr alle,
ich arbeite momentan an einem Chat-System. Man kann Nachrichten schreiben (Form) und empfangen (aus MySQL). Das Problem, das ich habe, ist, dass ich um neue Nachrichten zu erhalten, die Seite reloaden muss. Nutze ich
$page = $_SERVER['PHP_SELF'];
$sec = "10";
header("Refresh: $sec; url=$page");
Also, dass die Seite alle 10 Sekunden reloaded wird, kann man kaum eine Nachricht zuende schreiben. Meine Frage: Wie bekomme ich es hin, dass die Seite regelmäßig reloaded wird, ohne, dass die Form gelöscht wird. Freue mich auf Antworten.
Mats
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
das pullen erzeugt unnötig massive Server und Traffic ressourcen. (Besonders bei "alle sekunde [...] oder kürzer"
Besser wäre Long Polling oder WebSockets.
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.
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>
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.
Indem du nicht alle 10 Sekunden die Seite neu lädst.. das ist absoluter Quatsch. So macht man das nicht, bei keinem Chat.
Geht das auch mit purem php? Ich habe mir vorgenommen, die Seite ohne JS zu machen, da man das ja ausstellen kann...