Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.03.2016, 16:31
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

xmlhttp утечка памяти: net::err_insufficient_resources
Не давно начал программировать на JS . Взял готовый скрипт и потихоньку переделываю под себя. Коменты автора не удалял. Вообщем есть сервер Icecast 2 - с него берутся данные при помощи файла get.php
<?php
readfile('http://creepyradio.ru:8000/status2.xsl');
?>


Потом этот файл запрашивает parser.js
// Функция для упрощения написания, задаёт содержимое элементу DOM. Лень - двигатель прогресса!
function set (id, dat)
{
	var d = $("."+ id);
	d.innerHTML = dat;
}


function getXmlHttp() // получаем объект XMLHttpRequest, код взят из многочисленных примеров
{
  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;
}


function req () // запрос данных
{
	var xmlhttp = getXmlHttp()
	xmlhttp.open("GET", "/get.php", true); // просим данные у сервера в асинхронном режиме
	xmlhttp.onreadystatechange = function() 
		{
		  if (xmlhttp.readyState == 4) {
			 if(xmlhttp.status == 200)
			   processResult(xmlhttp.responseText); // отдаём на обработку
		}
	};
	xmlhttp.send(null);
}


function processResult (res) // обработка входящих данных
{
	var csRes = eval("(" + res + ")"); // да-да, тут должен использоваться jQuery, ибо безопасность и так далее. Но, так как это просто скрипт с примером, не буду ударяться в подробности.
	var a = []; // пустой массив, для дальнейших действий
rjname = null

		a = csRes["/stream_128"]; // если да, работаем с данными от него

	
		var titlemas = a["title"];
	trackname = titlemas.split('|');
	rjname = trackname[1];
	track = trackname[0];
	$(".trackholder").text( track ); // Отображаем текущий трек
	
	

        // Задаём все нужные нам поля (жанр, кол-во слушателей, описание станции и т.д.)
	$(".sName").text(a["name"]);
	$(".sDescr").text( rjname );

	
	setInterval("req()", 15000);  // Если всё прошло удачно, через 15 секунд обновим информацию о станции
// Здесь вместо setInterval используем setTimeout, чтобы при неработающем icecast скрипт не просил данные впустую.
}

req(); // первый запрос


Вот тут два вопроса :
1) Если DJ переподключается бесконечно сыпится ошибка, лечится перезагрузкой страницы: net::err_insufficient_resources с жалобой на 39 строчку ( xmlhttp.send(null); ). В чем беда? Наличие ошибки до моих исправлений не проверял.
2) В строчке 45 ( var csRes = eval("(" + res + ")"); ) советуют вставить jquery, но ввиду скудности знаний не пойму что тут надо вставить.

Заранее спасибо за ответы )))
Ответить с цитированием
  #2 (permalink)  
Старый 31.03.2016, 16:56
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Viger94,
Скрипт по производительности ниже плинтуса. Вместо функции getXmlHttp() должна создаваться утилита, которая определяет объект XMLHTTPRequest единожды для определенного пользователя. Зачем делать одни и те же операции бесконечно большое число раз?
Забыть об eval(), забыть об AJAX запросах по таймеру. В этом примере клиент посылает одни и те же запросы на сервер. Лучше использовать архитектуру COMET. HTML5 API предоставляет прекрасные фичи для этого https://learn.javascript.ru/server-sent-events
Ответить с цитированием
  #3 (permalink)  
Старый 31.03.2016, 17:14
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

Дело в том что данные на: http://creepyradio.ru:8000/status2.xsl меняются каждые 2-4 минуты (по песням) и надо как-то их перезапрашивать через промежутки времени, т.е. через равные промежутки запрашивается get.php который выводит данные с http://creepyradio.ru:8000/status2.xsl которые динамичные. Как же тогда сделать?
Ответить с цитированием
  #4 (permalink)  
Старый 31.03.2016, 17:20
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Viger94,
В php скрипте прописать sleep(кол-во ms) например. Потом из серверного скрипта запрашивать информацию. Запросили информацию, отправили на клиента, там обработали её. Только надо не забыть скрипту указать, чтобы данные клиенту сразу посылались, а не помещались в буфер.
Ответить с цитированием
  #5 (permalink)  
Старый 31.03.2016, 17:30
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

Сообщение от destus Посмотреть сообщение
Viger94,
В php скрипте прописать sleep(кол-во ms) например. Потом из серверного скрипта запрашивать информацию. Запросили информацию, отправили на клиента, там обработали её. Только надо не забыть скрипту указать, чтобы данные клиенту сразу посылались, а не помещались в буфер.
Если не секрет как сделать: чтобы данные клиенту сразу посылались, а не помещались в буфер.
Ответить с цитированием
  #6 (permalink)  
Старый 31.03.2016, 17:35
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Viger94,
http://php.net/manual/ru/function.flush.php
Ответить с цитированием
  #7 (permalink)  
Старый 31.03.2016, 17:38
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

Добрый человек, еще есть косяки в скрипте?)))
Ответить с цитированием
  #8 (permalink)  
Старый 31.03.2016, 17:43
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Viger94,
Некоторые переменные создаются в глобальном пространстве. По-хорошему переписать бы эту халтуру. Если вы чему-то хотите научиться, лучше самому писать, а не брать готовый. Тем более такого качества.
Ответить с цитированием
  #9 (permalink)  
Старый 31.03.2016, 17:45
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

Спасибо!) Я взял его для временной заглушки что бы было на первое время.
Ответить с цитированием
  #10 (permalink)  
Старый 01.04.2016, 05:07
Новичок на форуме
Отправить личное сообщение для Viger94 Посмотреть профиль Найти все сообщения от Viger94
 
Регистрация: 31.03.2016
Сообщений: 8

Сообщение от destus Посмотреть сообщение
Viger94,
Некоторые переменные создаются в глобальном пространстве. По-хорошему переписать бы эту халтуру. Если вы чему-то хотите научиться, лучше самому писать, а не брать готовый. Тем более такого качества.
По веселился я немного
Итого:
parser-new.js
var eventSource = new EventSource("http://creepyradio.ru/get-new.php", {
  withCredentials: true
});

eventSource.onopen = function(e) {
  console.log("Соединение открыто");
};

eventSource.onerror = function(e) {
  if (this.readyState == EventSource.CONNECTING) {
    console.log("Соединение порвалось, пересоединяемся...");
  } else {
    console.log("Ошибка, состояние: " + this.readyState);
  }
};

eventSource.onmessage = function(e) {
	data = e.data;
	datas = data.split(',');
	rjname = null
	titlemas = datas[2];
	trackname = titlemas.split('|');
	rjname = trackname[1];
	track = trackname[0];
	$(".trackholder").text( track );
	$(".sDescr").text( rjname );
};

где get-new.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
	while (true) {
	$source = file_get_contents('http://creepyradio.ru:8000/status2.xsl');
	echo "data:".$source."\n\n";
	flush();
	sleep(3);
}
?>

Теперь вроде все норм, но:
1) Подключается и обновляется инфа дольше 3 сек (около 20-30 сек) - может из-за цикла ибо сам файл тоже долго открывается;
2) Сообщения приходят по 3-4 раза.

Последний раз редактировалось Viger94, 01.04.2016 в 05:18.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти Nogard7491 Node.JS 23 16.11.2015 18:48
Утечка памяти в плагине для jQuery. TheWanderer jQuery 0 20.11.2013 16:22
утечка памяти и window.open Vovan222 Events/DOM/Window 2 27.12.2010 19:19
утечка памяти при создании DOM MadLord Общие вопросы Javascript 2 16.08.2010 12:01
Как происходит утечка памяти в даном случае? Yazla Общие вопросы Javascript 2 09.11.2009 13:02