Не удается напечатать цикл while () в php ajax - PullRequest
0 голосов
/ 15 сентября 2011

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

Итак, у меня есть этот php-код:

    while(@fopen("dl.conf","r")){ 
      print "Download will start soon";
      flush();
      sleep(1);
    }
    .
    .<br>
    

Он ничего не печатает, плюс, даже если я отменю этот файл, он не выполнит остальную часть сценария.

В основном пользователь может отправить файл для загрузки. это инициирует создание файла dl.conf. в фоновом режиме выполняется скрипт, проверяющий, существует ли dl.conf, если он читает его и запускает загрузку. Он также удалит файл dl.conf.

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

спасибо

Ответы [ 3 ]

0 голосов
/ 15 сентября 2011

Ну, вы блокируете ошибку.

Попробуйте это:

$fOpen = @fopen("dl.conf","r");

if(!$fOpen) die('ERROR of some kind...');

while($fOpen){ 
  print "Download will start soon";
  flush();
  sleep(1);
}
0 голосов
/ 15 сентября 2011

вам лучше использовать ajax для этого случая, а также изменить этот скрипт, который должен обрабатываться в событии ajax onresponse

if(file_exists('dl.conf'))
{
 return 'file created, download will start soon';
}
0 голосов
/ 15 сентября 2011

Вам не нужно использовать fopen(), чтобы проверить, есть ли файл, вы можете просто использовать file_exists(), как это.

// run loop till file exists
while(file_exists("dl.conf")){ 
    print "Download will start soon";
    flush();
    sleep(1);

    // clear stat cache to get correct file status
    clearstatcache();
}

Вам не нужен вызов clearstatcache (), если фоновый скрипт также является PHP-скриптом и использует unlink() для удаления файла dl.conf. Поскольку unlink() автоматически очищает кэш статистики файлов.

Обновление

Иногда только flush () или ob_flush не работают. Посмотрите на этот комментарий в документации PHP http://php.net/manual/en/function.ob-flush.php#90529

Так что, если вы точно используете output_buffering, вы можете попробовать этот набор команд.

ob_end_flush(); 
ob_flush(); 
flush(); 
ob_start(); 
...