Прогресс-бар на AJAX

WolandV

Новичок
Прогресс-бар на AJAX

Здравствуйте.
Пытался сделать прогресс-бар парсера сайта. В формочку надо вбить УРЛ, который будет парситься (урл календаря к примеру) и пока идет парсинг, хотел выдавать прогресс-бар и меняющиеся статусы ("Собираю информацию", "Обрабатываю", "Добавляю в БД", "Операция завершена. В БД добавлено %% записей").
По сабмиту формы вызывается:
PHP:
<input class="button" type="button" name="Submit" value="Submit" onClick="FormClick(); return false;">
(в хедере: )
PHP:
<script>
function FormClick ()
{
	var str = $("#ParserForm").serialize();
	$.post(
		"parser.php",
		str,
		function(CompleteNotice)
		{
			jQuery("#progress").empty();
			jQuery("#progress").append(Complete);
		}
	);
}
</script>
Сам скрипт парсера по ходу выполнения успешно возвращает и проценты, и статусы. Только не как по моей задумке "порциями", а в после выполнения скрипта выдает всю информацию для вывода сразу.

Мнения знакомых разделились. Один предлагает:
> вместо аякс запроса сделать пост во фрейм
> т.е.
> function submitFrame() {
> тут создание фрейма, и
> form.target = frame;
> form.submit();
> }
> также сделать функцию
> function showProgressHandler(p) {
> }
> сабмитить форму в parser.php
> и в моменты, когда ты считаешь, что пора отдавать проценты в браузер делаешь так:
> echo "<script> parent.showProgressHandler(52); </script>";
> flush();
> например так
> echo "<script>
> if(parent && parent.document && typeof(parent.document.showProgressHandler) == 'function') parent.document.showProgressHandler($Percentage);
> else if(top && top.document && typeof(top.document.showProgressHandler) == 'function') top.document.showProgressHandler($Percentage);
> </script>";
> flush();

> идея этого - создать фрейм, в котором открыть parser.php и он же будет переодически выплевывать JS код, который будет рисовать проценты
> то, что я тебе описываю обычно и реализовают в таких случаях
> с небольшими вариациями
> аякс для этого не подходит.

Но этот вариант во-первых не заработал из-за flush(), которому нужны "тепличные" условия и определенные настройки на хостинге, а во-вторых этот вариант раскритиковал второй знакомый, который предложил "домучать" AJAX.

Кто из них прав и как лучше реализовать мою задачу?
Заранее благодарю за помощь!
 

Adelf

Administrator
Команда форума
пиши лог в отдельный файл, который и надо периодически запрашивать
 

WolandV

Новичок
А вот так я пытался, только ничего хорошего не вышло. Делал так: Писал в парсере текущий процент и текущий статус с сессию, а по сабмиту формы вместе с отправкой параллельно запускался скрипт, который должен был выдывать текущий процент и статус с начала работы скрипта с периодичностью в 100мс. Когда парсер заканчивал работу, он должен был килять clearInterval'ом второй скрипт.
Да вот только ничего не заработало, потому что второй скрипт не выполнялся до тех пор, пока браузер "занят", а после "освобождения" от него толку уже не было. К тому же этот способ был с обоими знакомыми обсужден подробно и ими обоими забракован. ))
 

dimagolov

Новичок
Да вот только ничего не заработало, потому что второй скрипт не выполнялся до тех пор, пока браузер "занят"
а не потому, что залочен файл сессии?

что мешает первым ajax запросом инициировать процесс на сервере, а другими в цикле смотретьпрогресс первого?

session_write_close.
 

WolandV

Новичок
Автор оригинала: dimagolov
а не потому, что залочен файл сессии?
Это вопрос или ответ? )))
что мешает первым ajax запросом инициировать процесс на сервере, а другими в цикле смотретьпрогресс первого?
session_write_close.
А кусочек кода можно? )) А то я подозреваю, что ответ был полезным (наверное), но мне от него не полегчало ))) Извиняюсь, но мне скилла не хватает, чтобы без долгих мучений понять, как это реализовать )
 

dimagolov

Новичок
это было обоснованное предположение, которое ты должен проверить.

тут не подают код, а дают направление, в котором двигаться. если самостоятельно что-то делать желания нету, то направление в форум работа.
 

Alexandre

PHPПенсионер
я делал эту задачку так:

запускался скрипт, которому в качестве параметра передавалось имя временного файла.
другим скриптом запускался некий паобработчик, который в этот временный файл кидал JSON в котором была текущая информация о состоянии "приложения", те % обработанных файлов и тд. и тп.
по AJAX запросу я запрашивал этот файл и выводил в вви де прогресс бара. Нет ничего проще.
 

WolandV

Новичок
Автор оригинала: Alexandre
я делал эту задачку так:
...
Спасибо за совет. Попытался так сделать:
На кнопку сабмита повесил две функции
PHP:
<input class="button" type="button" name="Submit" value="Submit" onClick="FormClick(); TimeOut(); return false;">
а функции написал такие:
PHP:
function FormClick ()
{
	var str = $("#ParserForm").serialize();
	$.post(
		"parser.php",
		str,
		function(CompleteNotice)
		{
			//alert(CompleteNotice);
			alert("111111");
		}
	);
}
function TimeOut()
{
	setInterval(CurrentProgress(), 500);
}
function CurrentProgress ()
{
	var str = 111;
	$.post(
		"session.php",
		"",
		function(Complete)
		{
			var oComplete = JSON.parse(Complete);
			alert ("#####" + oComplete.Percentage);
			if (oComplete.Percentage >= 100)
			{
				clearInterval();
			}
		}
	);
}
В скрипте parser.php в цикле происходит такая вещь:
PHP:
$Percentage = round($kRound * ($kGoods+1)); // $kRound = round(100/$Counter, 2); $Counter - количество итераций цикла. $Goods - счетчик цикла.
	$temp .= $Percentage."+"; // это для теста. После окончания цикла делал echo $temp и на выходе получал "7+14+21+...+85+92+100+"
	$JsonDump = fopen("~temporarely.json", "w+");
	fwrite($JsonDump, "{\"Percentage\": \"".$Percentage."\"}");
	usleep(500000);
Специально поставил паузу в цикл полсекунды - за это время гарантированно должно успеть пройти чтение временного файла скриптом session.php, в котором только это:
PHP:
<?
$JsonDump = file("~temporarely.json");
echo $JsonDump[0];
unlink("~temporarely.json");
?>
В результате, при запуске формы выдается только алерт с "единичками", если временный файл существует (при этом временный файл не удаляется анлинком) и выдает сначала алерт с "#####100", а потом алерт с "единичками", если временного файла не существует на момент запуска скрипта (временный файл тоже не удаляется, не смотря на то, что файл session.php выполняется).
По симптомам понимаю, что где-то сильно закосячил. Подскажите пожалуйста, где ошибка.
 

WolandV

Новичок
Да, спасибо. Файл и вправду не закрывал. Сейчас в каждой итерации файл открывается, в него пишется новое значение, закрывается:
PHP:
$JsonDump = fopen("~temporarely.json", "w+"); 
    fwrite($JsonDump, "{\"Percentage\": \"".$Percentage."\"}"); 
    usleep(500000);
    fclose($JsonDump);
только все равно не полегчало - симптомы те же, что описывал выше.
 

dr-sm

Новичок
fclose($JsonDump);
usleep(500000);
наверно

hint: поставть файрбаг и посмотри, что конкретно происходит.
 
Сверху