Я вызываю Java-программу с системным вызовом PHP. Программа Java занимает некоторое время, но в конечном итоге будет создавать PDF-файл с известным именем файла.
Мне нужно продолжать проверять этот файл до тех пор, пока он не будет существовать, а затем выполните ссылку на него. Я предполагаю, что цикл while будет задействован, но я не хочу, чтобы он был слишком ресурсоемким. Каков хороший способ сделать это?
В принципе, вы поняли это правильно
while (!file_exists($filename)) sleep(1); print '<a href="'.$filename.'">download PDF</a>';
сна дает 1 секунду между проверками, поэтому он не будет стрессовать ваш процессор ни для чего
это сделает работу, но вы можете указать дополнительный тайм-аут.
while( !file_exists($pathToFile) ) { sleep(1); }
Если вам нужно отправить его обратно в браузер, вам, вероятно, следует исследовать использование вызова AJAX с помощью таймера setInterval и скрипта PHP, который проверяет наличие файлов. Вы можете сделать это двумя способами:
flush()
html обратно в браузер, который включает Javascipt, который запускает процесс опроса с использованием AJAX для стороны опроса браузера и вашего PHP-скрипта с функцией AJAX для обработки опроса.
Если 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, но если низкий трафик, то код выше.