Вопрос по отслеживанию прогресса выполнения скрипта

SiZE

Новичок
Для тестирования написал такой скрипт, собственно все что он делает, каждый раз обновляет строку в файле с данными о том сколько всего надо сделать и сколько всего сделано на данный момент:
PHP:
$total = 500000;
$start = time();

$fo = fopen("test.log","w");
fputs($fo,CJSON::encode(array(
    'start' => $start,
    'done' => 0,
    'total' => $total,
)));
fflush($fo); // сбрасываем файл не дожидаясь окончания работы скрипта
fclose($fo);

for( $i=1; $i<=$total; $i++ ){
    $percent = floor( $i * 100 / $total );
    $fo = fopen("test.log","w");
    fputs($fo,CJSON::encode(array(
        'start' => $start,
        'done' => $percent,
        'total' => $total,
    )));
    fflush($fo);
    fclose($fo);
}
Обращаюсь к нему через $.ajax, в котором указал для beforeSave такой код:
HTML:
for( var i=1; i<=5; i++){
setTimeout(function(){
   // здесь я обращаюсь к скрипту, который читает файл test.log
   // и данные выводит в консоль
   $.ajax ....
},(i*1000));
}
Скрипт который читает
PHP:
$file = file_get_contents("test.log");
header('Content-type: application/json');
echo $file;
exit;
И вообщем все пять запросов возвращают одни и те же данные данные когда 'done' = уже 100%. Я заметил что в хроме они выполняются только после основого запроса, хотя запросы должны быть асинхронные. Что сделать, чтобы данные возвращались по мере их запроса?
 
Последнее редактирование:

scorpion-ds

Новичок
http://api.jquery.com/jquery.ajax/
async (default: true)
Type: Boolean
By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().
Это, если я правильно понял проблему, то async надо установить false.
 

WMix

герр M:)ller
Партнер клуба
мне кажется это просто cache, добавь в query time()
асинхронность не мешает
 

SiZE

Новичок
мне кажется это просто cache, добавь в query time()
В консоли я обратил внимание, что запросы выполняются по одному.
Первым добавляется запрос для импорта данных, у него статус pending. Затем по одному, с интервалом в одну секунду запросы на чтение прогресса. У них тоже статус pending.

https://www.dropbox.com/s/gim84g3rxed0mx7/pending_queries.png

И только после того, как первый запрос отработает, остальные запросы тоже срабатывают.

https://www.dropbox.com/s/4ezvtpn62ro7c2a/pending_queries2.png?dl=0
 

SiZE

Новичок
Это, если я правильно понял проблему, то async надо установить false.
Если я так сделаю, каждый последующий запрос, будет ждать когда выполнится предыдущий, браузер каждый раз будет ждать пока придет ответ от сервера.
 

SiZE

Новичок
Может апач так режет? в ФФ тоже самое :((( Не знаю куда копать.
 
Сверху