Подскажите как сделать.(AJAX)

12
Maxouni
На сайте с 18.11.2008
Offline
119
1202

Может кто - нибудь сталкивался или встречал готовое решение.

Как реализовать такую вещь на AJAX:

есть PHP функция, которая допустим открывает в папке файлы, пишет в них че нито и закрывает - как в скрипте который эту функцию запускает реализовать вывод во время выполнения процентной строки этого процесса (допустим записалось 5(6,7) файлов из 100), хотя бы без строки просто чтоб число показывалось. Подскажиет статью или принцип решеня.

Создание, продвижение, поддержка сайтов и приложений.
CR
На сайте с 21.11.2008
Offline
146
#1

подскажу, не секрет)

В чистом аяксе есть он лоад - если помудрить то можно не дожидаться полной загрузки. это раз. 2 - в пхп юзать flush().

вообще способов еще масса. например - регулярно выливать file put contents в какой нить левый файл и дополнительным потоком с setTimeout от клиента узнавать текущее значение, не трогая главный скрипт.. думкай

Maxouni
На сайте с 18.11.2008
Offline
119
#2

Chikey.ru, Дружище спасибо тебе огромное, но блин хотелось бы примера. так тяжело из аякс познаний только библиотека, которая скрипт вызывает по свойству html(может подскажешешь пару статей нужных).

если надо могу по аське(скайпу выйти на связь).проконсультируйте господа опытные прогеры))

Brand from Amber
На сайте с 18.08.2007
Offline
293
#3

ИМХО, для "реализации вывод во время выполнения процентной строки" - AJAX вообще не нужен - достаточно не завершать поток данных (собственно формируемый HTML), пока не отработался скрипт (записывающий файлы) и периодически "выплёвывать" в этот поток необходимые данные (те самые бегущие строки).

P.S. Реализацию не подскажу, т.к. PHP не знаю 🚬

Лучший способ понять что-то самому - объяснить это другому.
neznaika
На сайте с 28.06.2006
Offline
356
#4
Brand from Amber:
и периодически "выплёвывать" в этот поток необходимые данные (те самые бегущие строки)

Курю, думаю, снова курю, поподробнее плиз.

Дорого покупаю настоящие сайты. Не инвестирую деньги и не беру кредиты.
[Удален]
#5

Что-то типа такого. Выолнено на jsHttpRequest


<div id="progressbar" style="height:20px;border:1px solid #0f0;width:0px;"></div>
<script>
function ajaxload(url,i)
{
try
{
JsHttpRequest.query(url,{"filenomber":i},
function(result,errors)
{
if(result)
{
return result;
}
else
{
return false;
}
},false);
}
catch(e)
{
return false;
}
}
maxfile=100;
for(i=0;i<maxfiles;i++)
{
resp=ajaxload('/script.php',i);
if(resp!=false)
{
document.getElementById('progressbar').style.width=round((i/maxfiles)*100);
}
else
{
alert('Alarm!');
break;
}
}
</script>

Собсттна будет посылаться запрос скриптку script.php с параметром filenomber - это будет порядковый номер обрабатываемого файла. Если не будет возвращаться false, то считается, что файл успешно обработан и прогрессбар увеличится, иначе выполнение прервётся.

Бэкэнд писать не буду, лень, да и праздник, а на нетрезвую голову только js могу накидать.

Brand from Amber
На сайте с 18.08.2007
Offline
293
#6
neznaika:
Курю, думаю, снова курю, поподробнее плиз.

А я не курю, поэтому у меня времени на подумать в три (если судить по отквоченной формуле) раза больше... ;)

P.S. Сейчас поздно - завтра (даст бог) "набросаю" примерчик.

[Удален]
#7

В общем есть один нюанс. Чисто технически это делается скорее всего так:

В скрипте php принудительно включаем буфер (ob_start), и в нужные моменты выплевываем туда данные - например значения процентов, разделенные чем-то (например ";"), используя ob_flush

Аяксовую часть делаем как обычно, например берем пример из википедии. Разница только в том - что данные нужно начать доставать из responseText когда readystate станет 3, а не 4, причем делать это нужно с заданной частотой (через setInterval как вариант), например 2 раза в секунду. Когда readystate станет 4, убиваем таймер и пишем 100%

Но вопрос - я не знаю тонкостей работы XmlHTTPRequest, есть вариант что он вернет readystate==4 как только буфер будет выплюнут первый раз. Это надо экспериментировать.

Можно конечно писать файл частями и вызывать скрипт многократно но это нерационаьлно как-то.

Flash таки лучше использовать

neolord добавил 10.05.2009 в 02:17

В общем все оказалось примерно так как я и сказал, только надо добавить после ob_flush() обычный flush()

А таймер даже не нужен, оказывается onreadystatechange срабатывает даже не при изменении статуса, а при изменении текста - но так тока в файрфоксе, в опере он нужен.

вот серверный код, который тупо тянет заданное время и показывает сколько времени прошло


ob_start();

$time=microtime(true);

$step=0;
$length=6.0; //скока времени тупить.
while (($dif=microtime(true)-$time)<$length)
{

if (($step_=floor(microtime(true)*15))>$step) //выводим не чаще чем 15 раз в секунду
{
$step=$step_;
echo ":",round($dif/$length*100);
ob_flush();
flush();
}


}

ob_end_clean();

клиентская часть (код глянете в сорцах) выглядит так:

awcms.ru/yu/test.html

мне даже самому нравится. Не знал что так можно.

Но: работает как надо только в файрфоксе.

В опере обновляет реже (ибо только по таймеру), и пока я не добавил ?random к запросу - кешировал.

В ие 6 не работает вообще.

В хроме тоже не работает (там не такой клевый XMLHttpRequest), но хотя бы в конце на 100% ставит - видимо, он получает все данные сразу и срать ему на буфер. И еще странно что chrome у меня идентифицирует себя как Mozilla Gecko, хотя вроде говорили что он на WebKit

IE7 у меня сам не работает :)

Если кто сможит это улучшить до кроссбраузерности - ПМ плз. Мне лень.

Maxouni
На сайте с 18.11.2008
Offline
119
#8

Спасибо всем буду разбираться.

Brand from Amber
На сайте с 18.08.2007
Offline
293
#9

Собственно говоря - вот (как и обещал): http://to.lcc.ru/test/

Ни какого аякса и работает под оперой, мозиллой и ИЕ.

P.S. Это не решение, а технология 🙄

CR
На сайте с 21.11.2008
Offline
146
#10

Ну мое тогда:

вместо flush время отвремени делать выброс в файл 1.txt

...

file_put_contents('1.txt',"Ready ".$proc);

...

js:

function zz(){

$.get('1.txt',{},function (text){

$("#p").html(text);

});

setTimeout("zz",1000);

}

... возможны синтакс ошибки, не проверял

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий