Long polling med Ajax & php
Hej eksperter, er igang med at lege med lidt Long polling i PHP samt ajax.Jeg har fået lavet mig et script som ser således ud:
Index.html:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> Comet : Ajax </title>
<style>
body { margin:0px; padding:0px; overflow:hidden; }
#msg { margin:0px; padding:10px;width : 700px; height:300px; overflow-y:scroll; border:1px solid #000; }
#send{ width: 700px; height:20px; overflow-y:scroll; }
#brugernavn{ width: 200px; height:20px; overflow-y:scroll; }
</style>
<script src="jquery.js"></script>
<script>
var timestamp = null;
function comet() {
alert("test2");
$.ajax({
type : 'Get',
url : 'read.php?timestamp=' + timestamp,
async : true,
cache : false,
success : function(data) {
var json = eval('(' + data + ')');
if(json['msg'] == ''){
$('#msg').html('No msg');
}else {
$('#msg').html(json['msg']);
$('#msg').animate({scrollTop: $('#msg').get(0).scrollHeight},200);
}
timestamp = json['timestamp'];
setTimeout('comet()', 1000);
},
complete: function(){
alert("test");
}
});
}
$(function() {
comet();
$('#send').bind('keyup', function(e) {
var msg = $(this).val();
var name = $('#brugernavn').val();
if(e.keyCode == 13 && e.shiftKey) {
return;
}else if(msg!='' && e.keyCode == 13 && document.getElementById('brugernavn').value != 0) {
$.ajax({
type : 'GET',
url : 'write.php?msg='+ msg +'&name='+ name,
async : true,
cache : false
});
$(this).val('')
}
})
});
</script>
</head>
<body>
<div id="msg"> </div>
<br />
Brugernavn: <input type="text" id="brugernavn" value=""><br>
Besked: <input type="text" id="send" name="msg" value="" width="200px">
</body>
</html>
read.php:
<?php
$filename = 'data.txt';
$last = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$current = filemtime($filename);
while( $current <= $last) {
usleep(10000);
clearstatcache();
$current = filemtime($filename);
}
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $current;
echo json_encode($response);
?>
Mit problem er at hvis der ikke er kommet noget i tekst filen, så timer PHP ud efter 30 sekunder. Men sender ikke noget "comeback" til ajax delen, hvilket gør at hvis der ikke er sket noget nyt i 30 sekunder, bliver den ikke "opdateret" ude i client, og man er nødtil at refresh siden.
Nogle som har en ide til hvordan det kan laves?