Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Периодичное получение данных


Автор: Gold Dragon 12.5.2010, 09:09
Суть проблемы следующая.. В базе формируются постоянно данные. Мне необходимо с определённой периодичностью получать эту информацию на странице. Это что-то автоматического обновление страницы каждые 3 секунды.

Как это можно реализовать с минимальной нагрузкой?

результатом будет вывод цифр в столбик


Автор: Guedda 12.5.2010, 09:25
C минимальной нагрузкой копай в сторону cron

Автор: Gold Dragon 12.5.2010, 09:29
cron это наверное не совсем то.. Я должен открыть определённую страницу с браузере


Автор: Guedda 12.5.2010, 09:52
Ну тогда методами AJAX думаю будет самое оптимальное (с некоторой периодичностью собирать данные и обрабатывать их) - допустим, как это делает твиттер (когда появляются новые твиты).

Автор: Gold Dragon 12.5.2010, 09:54
да, это наверное самое оптимально.. К сожалению я только-только взялся за Аякс... :( может у кого примерчик есть или ссылка на пример?

Автор: NewDima 12.5.2010, 11:06
http://javascript.ru/setTimeout + http://api.jquery.com/jQuery.getJSON/
С сервера передаете некоторую метку последней переданной информации, например id последней переданной записи. А на клиенте запрашиваете все данные после этой записи, ну и соответственно обновляете информацию

Автор: Gold Dragon 12.5.2010, 11:10
большое спасибо! сейчас попробую

Автор: MoLeX 12.5.2010, 11:20
как то так:

Код

<?php
   if( isset($_SERVER['HTTP_X_REQUESTED_WITH']) )
      die("<br />time: ".time());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test AJAX</title>
<meta http-equiv="Content-Language" content="ru" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://code.jquery.com/jquery-1.4.2.js" type="text/javascript"></script>
<script type="text/javascript">
function MyFunc()
{
   $.get("http://<?=$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];?>", {ajax: "true"}, function(data)
   {
      $("#MyDIV").append(data);
   });
   
   window.setTimeout(MyFunc, 3000);   
}

window.setTimeout(MyFunc, 3000);
</script>
</head>
<body>

<div id="MyDIV">Info</div>

</body>
</html>

Автор: Gold Dragon 13.5.2010, 07:40
вот что у меня получилось

дамп
Код

CREATE TABLE `ajax` (
  `id` int(11) NOT NULL auto_increment,
  `num` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=18 ;


INSERT INTO `ajax` VALUES (1, 2);
INSERT INTO `ajax` VALUES (2, 2);
INSERT INTO `ajax` VALUES (3, 2);
INSERT INTO `ajax` VALUES (4, 1);
INSERT INTO `ajax` VALUES (5, 1);
INSERT INTO `ajax` VALUES (6, 2);
INSERT INTO `ajax` VALUES (7, 3);
INSERT INTO `ajax` VALUES (17, 8);
INSERT INTO `ajax` VALUES (16, 2);


sms.php
Код

<?php

mysql_connect('localhost','root','');
mysql_select_db('fipuche');

$result = mysql_query("SELECT * FROM ajax");
while ($row = mysql_fetch_object($result)) {
    echo $row->num."<br />";
}
?>


index.html
Код

<html>
<head>
<title></title>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
    setInterval(function(){
        $("#qqq").load("sms.php");
    }, 3000);
});

</script>
--------------------
<div id="qqq"></div>
--------------------
</body>
</html>

что лишнее, а что можно подправить? Хотя эту тему в другой раздел я думаю нужно перенести..

MoLeX,  что-то не совсем понял твой код

Автор: MoLeX 13.5.2010, 07:42
Gold Dragon, да тоже самое что у тебя, реализация только через get сделана

Добавлено через 45 секунд
+ у меня не затирается информация, а добавляется

Автор: Gold Dragon 13.5.2010, 07:43
а в чём разница? что лучше или хуже?

Добавлено через 6 минут и 55 секунд
ну про добавление я знаю.. я просто у себя это не сделал, так как пока не понял как мне передавать последний ID чтобы запрашивать из базы не всё, а только последнее.. Вот тогда и понадобится добавление.

кто знает как это реализовать?

Автор: NewDima 13.5.2010, 11:56
Проще всего как-то так:

В конце вывода кода
Код

<script>
var lastId = <?php echo $row->id; ?>;
</script>

+ использовать append как у MoLeX. Только скрипту с запросом передавать lastId. А в ответе sms.php
Код

<script>
lastId = <?php echo $row->id;?>;
</script>

Ну и в sms.php делать запрос всех записей с id больше переданной

Добавлено через 1 минуту и 59 секунд
только если СУБД умеет использовать id, которые пропущены в результате удаления, этот способ не будет работать конкретно, придется работать с временной меткой, например

Автор: Gold Dragon 13.5.2010, 12:00
NewDima, что-то я запутался.. ты можешь мой код подправить?

Автор: MoLeX 13.5.2010, 12:06
sms.php
Код

<?php
mysql_connect('localhost','root','');
mysql_select_db('fipuche');
$result = mysql_query("SELECT * FROM `ajax` WHERE `id` > ".$_GET['id']);
while ($row = mysql_fetch_object($result)) {
    echo $row->num."<br />";
}
?>



Код

<?php
$id = 2; // последний иди в БД на данный момент
?>

<html>
<head>
<title></title>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
    setInterval(function(){
   $.get("sms.php", {id: "<?=$id;?>"}, function(data)
   {
      $("#qqq").append(data);
   });
    }, 3000);
});
</script>
--------------------
<div id="qqq"></div>
--------------------
</body>
</html>


Добавлено @ 12:06
как то так, код не проверял

Автор: NewDima 13.5.2010, 12:34
MoLeX, не, так не покатит, значение передаваемого id придется обновлять после каждого запроса. Проще сделать это будет, как я написал

Я поправил код Molex

sms.php
Код

<?php
mysql_connect('localhost','root','');
mysql_select_db('fipuche');
$result = mysql_query("SELECT * FROM `ajax` WHERE `id` > ".$_GET['id']);
while ($row = mysql_fetch_object($result)) {
    echo $row->num."<br />";
}
?>
<script>
lastid = <?php echo $row->id; ?>;
</script>



Код

<html>
<head>
<title></title>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
   var lastId = <?php echo $row->id; ?>
    setInterval(function(){
   $.get("sms.php", {'id': lastId}, function(data)
   {
      $("#qqq").append(data);
   });
    }, 3000);
});
</script>
--------------------
<div id="qqq"></div>
--------------------
</body>
</html>

Автор: Gold Dragon 13.5.2010, 12:45
пока не проверил код, поясните чем $.get лучше $.load?

Добавлено через 2 минуты и 38 секунд
или может вообще POST... ?

Автор: MoLeX 13.5.2010, 12:52
NewDima,
Код

<?php
mysql_connect('localhost','root','');
mysql_select_db('fipuche');
$result = mysql_query("SELECT * FROM `ajax` WHERE `id` > ".$_GET['id']);
while ($row = mysql_fetch_object($result)) {
    echo $row->num."<br />";
}
?>
<script>
lastid = <?php echo $row->id; ?>;
</script>


а разве так можно???


переписал:
sms.php
Код

<?php
mysql_connect('localhost','root','');
mysql_select_db('fipuche');
$result = mysql_query("SELECT * FROM `ajax` WHERE `id` > ".$_GET['id']);
if( mysql_num_rows($result) > 0 )
{
   $txt = '';
   while( $row = mysql_fetch_object($result) ) 
   {
      $txt .= $row->num.'<br />';
      $id = $row->id;
   }
   
   echo '{ "num": "'.$txt.'", "id": "'.$id.'" }';
}
else
{
   echo '{ "id": "'.$_GET['id'].'" }';
}
?>


Код

<html>
<head>
<title></title>
<script src="http://code.jquery.com/jquery-1.4.2.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function()
{
   var id_start = 1;
   
   setInterval(function()
   {
      $.ajax(
      {
         type: "GET",
         url: "sms.php?id=" + id_start,
         dataType: "json",
         success: function(data)
         {
            if( data.num != undefined )
            {
               $("#qqq").append(data.num);
            }
            
            id_start = data.id; 
         }
      });
      
   }, 3000);
});
</script>
</head>
<body>
--------------------
<div id="qqq"></div>
--------------------
</body>
</html>


Добавлено через 41 секунду
P.S. sms.php надо переделать малость, а именно определение последнего id

Автор: NewDima 13.5.2010, 13:05
Если не смотреть на то, что у меня нет проверки на валидность $row, то можно, код выполнится на клиенте когда будет добавлен с jquery

Автор: Gold Dragon 13.5.2010, 13:07
Цитата(Gold Dragon @  13.5.2010,  13:45 Найти цитируемый пост)
пока не проверил код, поясните чем $.get лучше $.load?

или может вообще POST... ? 
smile


Цитата(MoLeX @  13.5.2010,  13:52 Найти цитируемый пост)
P.S. sms.php надо переделать малость, а именно определение последнего id 

ну так max(id) просто добавить в запрос

Автор: NewDima 13.5.2010, 13:10
Зачем? Вы же и так делаете выборку всех записей. В последней и будет нужное значение. А, кстати, понял, о чем Molex сказал. Конечно, значение по-любому будет не валидно в $row после последнего вызова mysql_fetch_object, но это легко исправить

Автор: Gold Dragon 13.5.2010, 13:13
Цитата(NewDima @  13.5.2010,  14:10 Найти цитируемый пост)
В последней и будет нужное значение. 
Смотря какая сортировка будет smile ведь данные не только на этой странице используются..

Цитата(NewDima @  13.5.2010,  14:10 Найти цитируемый пост)
А, кстати, понял, о чем Molex сказал.
а я не понял :(

Автор: NewDima 13.5.2010, 13:16
Gold Dragon, зато max id  не всегда самая последняя запись. В таком случае, думаю у вас по-любому у новостей, или что там, будет временная метка добавления, вот от нее и отталкивайтесь =)

Автор: Gold Dragon 13.5.2010, 13:34
Цитата(NewDima @  13.5.2010,  14:16 Найти цитируемый пост)
Gold Dragon, зато max id  не всегда самая последняя запись
 сортировка по разным параметрам в базе будет постоянно.. а вот изменение AUTO_INCREMENT я что-то и не знаю когда используется.. Да же если и так, то это очень и очень редко и то при администрировании базы smile

Автор: Gold Dragon 17.5.2010, 10:36
Немного усложнённый вопрос... А можно ли как-то получать этот набор, но без тэгов, т.е. чистые данные на чистом листе?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)