
24.08.2010, 09:00
|
 |
Профессор
|
|
Регистрация: 24.09.2007
Сообщений: 165
|
|
Разрастается память при AJAX
Добрый день. У меня возникла проблема с памятью. В программе используется библиотека JQuery. На странице идет вызов функции через определенный интервал времени и с каждым разом занимаемый размер памяти увеличивается.
Вызываемая функция:
setInterval("gettime()", 10);
function gettime(){
$.post( '<? echo SITE_URL; ?>includes/function_.php?act=que_time',
{
},
function(data){
if (data){
if (data.length == 5){
$("#time").html(data);
//document.getElementById('time').innerHTML = data;
}
}
});
}
});
}
Функция отвечающая:
if ($act == "que_time"){
//ajax_enter();
ob_start();
echo date("H:i", time());
$ret = ob_get_contents();
ob_end_clean();
echo $ret;
//echo ajax_return($ret);
}
возможно ли оптимизировать?
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
|
|

24.08.2010, 10:02
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Для начала вынеси callback-функцию и передавай ссылку на неё:
function callback(data){
if (data && data.length == 5){
$("#time").html(data);
//document.getElementById('time').innerHTML = data;
}
}
function gettime(){
$.post('<? echo SITE_URL;?>includes/function_.php?act=que_time', null, callback);
}
setInterval(gettime, 10);
Ну и небольшой рефакторинг. Если не поможет - отруби JQ.
PS: заметь, как все стало намного читабельнее...
|
|

24.08.2010, 10:11
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
А вообще не обязательно дергать сервер для получения времени. Можно его получить 1 раз и далее вычислять изменения на клиенте, относительно его времени.
Для таких таймеров лучше не использовать setInterval, а такую конструкцию:
(function(){
// Нужные действия
setTimeout(arguments.callee, 10);
})();
Если я замечу, что какой-нибудь сайт шлет запросы каждые 10 мс (ну или хотя бы каждые 3-5 секунд) - я никогда больше на него не зайду.
|
|

24.08.2010, 10:47
|
 |
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от B~Vladi
|
Если я замечу, что какой-нибудь сайт шлет запросы каждые 10 мс (ну или хотя бы каждые 3-5 секунд) - я никогда больше на него не зайду.
|
не держать тебе блог на WordPress)))
|
|

24.08.2010, 10:52
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Gvozd
|
не держать тебе блог на WordPress)))
|
Аха, я уже наслышан о нем 
|
|

24.08.2010, 11:21
|
 |
Профессор
|
|
Регистрация: 24.09.2007
Сообщений: 165
|
|
Сообщение от B~Vladi
|
А вообще не обязательно дергать сервер для получения времени. Можно его получить 1 раз и далее вычислять изменения на клиенте, относительно его времени.
Для таких таймеров лучше не использовать setInterval, а такую конструкцию:
(function(){
// Нужные действия
setTimeout(arguments.callee, 10);
})();
Если я замечу, что какой-нибудь сайт шлет запросы каждые 10 мс (ну или хотя бы каждые 3-5 секунд) - я никогда больше на него не зайду.
|
это пример (на самом деле функции сложнее, но даже эта функция набирает память). у меня свой внутренний модуль (пользователи не видят его). грузится мой компьютер, через часов 6 работы бывает подвисание браузера.
п.с. в рабочем варианте таймеры другие стоят (но нагрузка идет)
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
|
|

25.08.2010, 16:14
|
 |
Профессор
|
|
Регистрация: 24.09.2007
Сообщений: 165
|
|
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
xmlhttp.open('GET', '<? echo SITE_URL; ?>includes/function_.php?act=que_time', true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
callback_time(xmlhttp.responseText);
}
}
};
xmlhttp.send(null);
таким способом тоже загружает память. есть еще какие либо идеи?
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
|
|

25.08.2010, 16:15
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Phoenix
|
есть еще какие либо идеи?
|
Сообщение от Phoenix
|
setInterval("gettime()", 10);
|
Поставить реальное число, вместо 10.
|
|

25.08.2010, 16:22
|
 |
Профессор
|
|
Регистрация: 24.09.2007
Сообщений: 165
|
|
Сообщение от Kolyaj
|
Поставить реальное число, вместо 10.
|
и стоит реальное число. просто за рабочий день набегает объем. а так я его нагоняю за 5-10 минут... в идеале надо, что бы память не терялась!
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
|
|

25.08.2010, 16:25
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Это некорректно. За 10 миллисекунд даже локальный сервер не успеет ответить, следовательно, делается несколько параллельных запросов, параллельно можно делать конечное количество запросов, поэтому они ждут где-то в очереди браузера. В результате вы тестируете вовсе не то, что у вас есть на самом деле.
|
|
|
|