Вопрос по Ajax

12 3
R
На сайте с 13.06.2009
Offline
47
2027

Как можно сделать вывод хода выполнения операции.

Скажем есть php скрипт, который выполняет рассылку писем и есть страница, на которой мы выбираем список адресов. Т.е. выбираем адреса, жмем кнопку "отправить", на ajax выполняем отправку данных на обработку.

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

Как сделать такое.

P.S. Из знакомых мне вариантов: отправлять на обработку маленькими кусочками - скажем по 5 (метод не подходит), еще как вариант - очередь сообщений (тоже не подходит).

nipler
На сайте с 04.07.2008
Offline
93
#1

Другого способа как отправлять на обработку маленькими кусочками наверно нет.

Быстропост – система автоматической монетизации (http://bystropost.ru/partner/248) Удобный бесплатный инструмент для вебмастера и оптимизатора (http://site-control.ru/)
_vb_
На сайте с 25.07.2009
Offline
104
#2

Вешать js на таймер и периодически опрашивать сервер о ходе выполнения? По завершении задачи снимать с таймера обработчик.

На стороне сервера должна быть поддержка этого механизма.

Саратовская фракция серча (). Давайте посчитаемся.
R
На сайте с 13.06.2009
Offline
47
#3
nipler:
Другого способа как отправлять на обработку маленькими кусочками наверно нет.

Думаю, что есть еще что то. Например, сохранение во временный файл результата выполнения, но у меня с таким вариантом проблемы: браузер не хочет отправлять новые Ajax запросы пока, не получит результат от прошлого ajax запроса (как убить запрос не дожидаясь ответа сервера?).

K
На сайте с 28.12.2008
Offline
61
kud
#4
recrut:
браузер не хочет отправлять новые Ajax запросы пока, не получит результат от прошлого ajax запроса (как убить запрос не дожидаясь ответа сервера?).

Должен отправлять .. ну, только если Вы не используете синхронный запрос.

_vb_
На сайте с 25.07.2009
Offline
104
#5
recrut:
как убить запрос не дожидаясь ответа сервера?

Таймаутом можно.

R
На сайте с 13.06.2009
Offline
47
#6
kud:
Должен отправлять .. ну, только если Вы не используете синхронный запрос.

Нет не использую.

_vb_:
Таймаутом можно.

Проверял еще вчера не помогло.

Тут суть такая. Первый запрос отправляет данные на обработку, а через две секунды создается еще один запрос, который уже смотрит ход выполнения (из временного файла). Запросы создается как бы оба, но пока первый не вернет результат, второй не отработает (не вернет свой результат).

[Удален]
#7

Выводить ”хода выполнения операции” можно следующим образом: для странице используем (readyState == 3), а для PHP-скрипта — flush().

Страница:

<input type='button' onclick='start()' />

<div id='loading'></div>
<script>
function start()
{
var http = new XMLHttpRequest();
http.open( 'GET', 'ajax.php', true );
http.onreadystatechange = function()
{
if( http.readyState == 4 || http.readyState == 3 )
{
writeProgress( http.responseText );
}
}
http.send( null );
}

function writeProgress( data )
{
document.getElementById( 'loading' ).innerHTML = data;
}
</script>

PHP-скрипт (ajax.php):

<?php

$nr = 100;
while( $nr )
{
--$nr;
if( ( $nr%10 ) == 0 )
{
echo '.';
flush();
sleep(1);
}
}
echo 'finish';
?>

ps. Не забудьте про кросс-браузерности XMLHttpRequest`а.

C
На сайте с 15.07.2008
Offline
59
#8
w0den:
Выводить ”хода выполнения операции” можно следующим образом: для странице используем (readyState == 3), а для PHP-скрипта — flush().

Страница:
<input type='button' onclick='start()' />

<div id='loading'></div>
<script>
function start()
{
var http = new XMLHttpRequest();
http.open( 'GET', 'ajax.php', true );
http.onreadystatechange = function()
{
if( http.readyState == 4 || http.readyState == 3 )
{
writeProgress( http.responseText );
}
}
http.send( null );
}

function writeProgress( data )
{
document.getElementById( 'loading' ).innerHTML = data;
}
</script>


PHP-скрипт (ajax.php):
<?php

$nr = 100;
while( $nr )
{
--$nr;
if( ( $nr%10 ) == 0 )
{
echo '.';
flush();
sleep(1);
}
}
echo 'finish';
?>


ps. Не забудьте про кросс-браузерности XMLHttpRequest`а.

Не выйдет.

Я как раз столкнулся с похожей ситуацией. Решил ее через временный файл в который складывал промежуточные результаты, а новыми запросами получал их.

P.S. Постараюсь на следующей неделе написать статью об этом.

K
На сайте с 28.12.2008
Offline
61
kud
#9
recrut:

Запросы создается как бы оба, но пока первый не вернет результат, второй не отработает (не вернет свой результат).

ajax_test.php:

<?php
set_time_limit(0);
if (isset($_GET['work'])) {
$count = 0;
while($count < 10) {
$data = date("h:i:s");
file_put_contents("./status.txt",$data);
sleep(1);
$count++;
}
exit;
}

if (isset($_GET['status'])) {
$data = is_file("./status.txt") ? file_get_contents("./status.txt") : 'no data';
echo $data;
exit;
}

?>

<html>
<head>
<title>Ajax status testing</title>
</head>

<body>
<script>
function AjaxSender() {
var xmlhttp,bComplete;
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();
}
if (!xmlhttp) return null;
this.sendData = function(URL, Method, Data, Callback) {
if (!xmlhttp) return false;
bComplete = false;
Method = Method.toUpperCase();
try {
if (Method == "GET") {
xmlhttp.open(Method, URL+"?"+Data, true);
Data = "";
}
else
{
xmlhttp.open(Method, URL, true);
xmlhttp.setRequestHeader("Method", "POST "+URL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete) {
bComplete = true;
Callback(xmlhttp);
}
};
xmlhttp.send(Data);
}
catch(z) { alert (z); return false; }
return true;
}
return this;

}
var x;
function startWorking() {
x = setInterval(checkStatus,1000);
ajax = new AjaxSender();
ajax.sendData ("./ajax_test.php","GET","&work=1",finishWorking);


}

function finishWorking(data) {
clearInterval(x);
}

function checkStatus() {

ajax = new AjaxSender();
ajax.sendData ("./ajax_test.php","GET","&status=1",updateStatus);

}

function updateStatus(data) {
var statusDiv = document.getElementById('status');
statusDiv.innerHTML = data.responseText;

}
</script>

<a href = "#" onclick = 'startWorking();'>старт</a>

<div id = "status">

</div>
</body>

</html>
beginerx
На сайте с 13.07.2009
Offline
173
#10

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

>>>Скорость и Реакция<<< (https://vk.com/app4629907 ): онлайн тренировка скорости и времени реакции.... (https://vk.com/app4612117 )... (https://vk.com/club18740762 ).
12 3

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