JQuery Ajax отображать данные, как они поступают
Допустим, у меня есть страница, которая медленно возвращает кучу данных с течением времени. Мол, это например:
<?php
$iTime = time();
while(time()-$iTime < 10 ) {
echo "Hello world";
echo str_repeat( ' ', 1024 ) . "<br />";
flush( );
sleep(3);
}
?>
Я хочу показать все данные, как они поступают. Таким образом, он будет обновляться "вживую". Как, например, после отправки строки данных это позволит мне проанализировать данные и отобразить их?
Есть ли способ сделать это через JQuery? Я прошу прощения, если это было задано ранее
Спасибо за ваше время!:)
3 ответа
Конечно, создание базового длинного опроса в стиле кометы довольно тривиально:
PHP:
<?php
$data = null;
while ($data == null)
{
$data = find_data($_REQUEST['last_update']); // This is up to you.
// Although you may do a DB query, that sort of breaks the model
// from a scalability perspective. The point in this kind of
// operation is to rely on external data to know that it needs to
// update users, so although you can keep your data in a DB, you'll
// want a secondary storage mechanism to keep from polling it.
//
// Conceptually, you'd put new information into this data storage
// system when something changes (like new data from an external
// source. The data storage system could check to see if a file
// has been updated or if there is new data in something like a
// memcached key. You'd then consume the data or otherwise
// mark it as used.
sleep(5);
}
echo json_encode($data);
JavaScript:
function setListener()
{
$.ajax({
url: 'updater.php',
dataType: 'json',
success: function(data, status, xhr)
{
// do something, such as write out the data somewhere.
setListener();
},
error: function()
{
setTimeout(setListener,10000);
}
});
}
Взгляните на плагин ht tp://plugins.jquery.com/project/ajax-http-stream. Он расширяет вызовы jquery ajax для приема потоковых данных кометы из бэкэнда и вызывает функцию OnDataRecieved
когда поступают новые данные.
Что ж, вы попадаете на ограничения самого протокола HTTP, так что это не столько jQuery, сколько веб-программирование. Если вам действительно нужно проталкивание в режиме реального времени, тогда вам подойдет другой протокол, например XMPP (который используют несколько крупных игроков, например Google Wave).
Однако с jQuery я бы использовал обычный опрос для ресурсов с малой задержкой и низким энергопотреблением для выполнения работы (легко создавать статические ресурсы, которые должным образом используют HTTP-кэширование, полагаясь на REST, чтобы помочь вам), так что что-то сродни;
- setTimeout ('myPoll ("http: // my_feed")', 500);
- my_feed с использованием HTTP-кэширования в качестве статического средства (возможно, для каждого пользователя, если необходимо)