Как продолжать проверять файл, пока он не существует, а затем предоставить ссылку на него - PullRequest
5 голосов
/ 03 мая 2011

Я вызываю Java-программу с помощью системного вызова PHP. Java-программа запускается некоторое время, но в конечном итоге создаст файл PDF с известным именем файла.

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

Ответы [ 3 ]

6 голосов
/ 03 мая 2011

В принципе, вы правильно поняли

while (!file_exists($filename)) sleep(1);
print '<a href="'.$filename.'">download PDF</a>';

сон дает 1 секунду между проверками, поэтому он не будет нагружать ваш процессор даром

3 голосов
/ 03 мая 2011

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

while( !file_exists($pathToFile) )
{
    sleep(1);
}
1 голос
/ 03 мая 2011

Если вам нужно отправить его обратно в браузер, вам, вероятно, следует исследовать использование вызова AJAX для таймера setInterval и сценария PHP, который проверяет существование файлов. Вы можете сделать это двумя способами:

  1. flush() html обратно в браузер, включающий Javascipt, который запускает процесс опроса, используя AJAX для стороны браузера, и ваш PHP-скрипт с функцией AJAX для обработки опроса.

  2. Если flush() не работает, вы должны вернуть HTML вашего PHP-скрипта ДО установки вашего Java-процесса. В этот код вставьте два вызова AJAX. Тот, который запускает реальный процесс Java, и тот, который запускает сервис опроса, ищущий файл.

Длительные скрипты могут задержать браузер, прежде чем вы сможете получить ответ от вашего Java-приложения, поэтому вам, вероятно, понадобится браузер для асинхронной работы вашего Java-процесса.

С другой стороны, если это запущенный скрипт PHP или процесс Java меньше обычного времени ожидания браузера, вы можете просто использовать что-то вроде:

$nofileexists = true;
while($nofilexists) { // loop until your file is there
  $nofileexists = checkFileExists(); //check to see if your file is there
  sleep(5); //sleeps for X seconds, in this case 5 before running the loop again
}

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

...