2011-05-03 10 views
5

Llamo a un programa Java con una llamada al sistema PHP. El programa Java tarda un tiempo en ejecutarse pero eventualmente producirá un archivo PDF con un nombre de archivo conocido.Cómo seguir buscando un archivo hasta que exista, luego proporcione un enlace

Necesito seguir buscando este archivo hasta que exista y luego mostrarle un enlace. Supongo que un ciclo while estará involucrado, pero no quiero que sea demasiado intensivo en recursos. ¿Cuál es una buena manera de hacer esto?

Respuesta

6

Básicamente lo ha hecho bien

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

el sueño da 1 segundo entre las comprobaciones por lo que no hará hincapié en su CPU para nada

3

esto hará el trabajo pero puede especificar un tiempo de espera adicional.

while(!file_exists($pathToFile)) 
{ 
    sleep(1); 
} 
1

Si tiene que enviar de vuelta al navegador , probablemente deberías investigar usando una llamada AJAX en un temporizador setInterval y un script PHP que verifica la existencia de archivos. Esto se puede hacer de dos maneras:

  1. flush() HTML al navegador que incluye Javascipt que se inicia un proceso de votación utilizando AJAX para el lado del sondeo del navegador y su script PHP con una función de AJAX para procesar la encuesta.

  2. Si flush() no funciona, entonces debe devolver el código HTML de su script PHP ANTES de configurar su proceso de Java. En ese código, coloca dos llamadas AJAX. Uno que inicia el proceso real de Java y otro que inicia un servicio de votación en busca del archivo.

secuencias que se ejecutan largos puede ser el tiempo de espera del navegador antes de poder obtener una respuesta de la aplicación Java, por lo que es probable que tengas el navegador para funcionar de forma asíncrona de su proceso de Java.

Por otro lado, si este es un script PHP puro correr o el proceso de Java es menor que un tiempo de espera típico navegador, puede simplemente usar algo como:

$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 
} 

Usted no ha mencionado si esto sería una llamada de alto tráfico (para muchos usuarios públicos) o una aplicación de tipo de informe. Si hay mucho tráfico, recomendaría la ruta AJAX, pero si el tráfico es bajo, entonces el código anterior.

Cuestiones relacionadas