Hi,
für ein Long Polling verwende ich das unten aufgeführte Script. Via Ajax wird das Script angestoßen. Sobald die Success Funktion des Ajax Calls aufgerufen wird, werden verschiedene Funktionen auf meiner Page (Intranet) ausgeführt.
Nun zu meiner Frage:
Zu welchen Problemen kann es dabei kommen? Was passiert, wenn die Serververbindung abbricht, jedoch die Seite nicht neu geladen wird.
Bekommt das der End-User mit?
Wie könnte man es besser machen, bzw. muss man es überhaubt besser machen?
Grüße
Schmakus
PHP
<?php
/* Long Polling: Ermitteln des letzten Zeitpunkt in der Datenbank.
* Sobald ein neuer Eintrag in der Datenbank erfolgt ist, wird dieses
* Script abgebrochen und das jeweilige Datum an den AJAX Request übergeben.
*/
//******* Server-Timeout auf Null setzten, da sonst der Apache Server nach 30 Sekunden eine Fehlermeldung ausgibt.
set_time_limit(0);
//******* Settings importieren
include("../include/settings.inc.php");
//******* Datenbank-Klasse aufrufen
require("Db.class.php");
$db = new Db();
//******* Variable $lastTime festlegen oder aus AJAX Request auslesen
if(isset($_GET['timestamp']) && ($_GET['timestamp'] !== '')): $lastTime = $_GET['timestamp'];
else: $lastTime = '';
endif;
//******* Letztes getracktes Datum aus der MySQL Tabelle 'tracking' holen
function getLastModifiedTime($db) {
return $selected = $db->single("SELECT DISTINCT max(TIMESTAMP(last_change)) as last_change FROM tracking");
}
//******* Letztes Datum für den ersten Aufruf auslesen
$lastModified_timestamp = getLastModifiedTime($db);
//******* Nichts tun, solange das letzte Datum der Datenbank kleiner oder gleich ist als "lastTime"
while ($lastModified_timestamp <= $lastTime) {
usleep(2000000); // slow it down a bit and wait 2 seconds
clearstatcache();
$lastModified_timestamp = getLastModifiedTime($db);
}
//******* Wenn Schleife abgebrochen, dann letzte Datenbank-Zeit ausgeben und Verbindung beenden
echo $lastModified_timestamp;
?>
Alles anzeigen
JavaScript
//******* Prüfen, ob neuer Datenbank-Eintrag vorhanden, wenn ja wird Funktion "RefreshDataOnPage()" aufgerufen
function refresh(timestamp) {
if (!timestamp) { timestamp = ''; } // Sofern "timestamp" false -> Anlegen mit leerem Inhalt
$.ajax({
url: 'ajax/check.for.new.sql.entry.php', // url zum PHP Script
type: 'GET', // Methode GET gewählt
data: {timestamp:timestamp}, // Daten für die Übergabe an das PHP Script
cache: false,
success: function (data, textStatus) { // Sobald ein neuer Eintrag in der Datenbank vorhanden
RefreshDataOnPage(); // Funktion zum erneuern von diversen Daten
refresh(data); // AJAX Call erneut aufrufen und letztes Änderungsdatum der Datenbank übergeben (timestamp)
},
})
.done(function() {
})
.fail(function(error) {
refresh(data);
console.log('Error: ' + error.statusText);
});
};
Alles anzeigen