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

  • Автор темы Автор темы SiZE
  • Дата начала Дата начала

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%. Я заметил что в хроме они выполняются только после основого запроса, хотя запросы должны быть асинхронные. Что сделать, чтобы данные возвращались по мере их запроса?
 
Последнее редактирование:
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.
 
мне кажется это просто cache, добавь в query time()
асинхронность не мешает
 
мне кажется это просто 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
 
Это, если я правильно понял проблему, то async надо установить false.
Если я так сделаю, каждый последующий запрос, будет ждать когда выполнится предыдущий, браузер каждый раз будет ждать пока придет ответ от сервера.
 
Может апач так режет? в ФФ тоже самое :((( Не знаю куда копать.
 
Сверху