2008-12-10 20 views
5

Estoy tratando de escribir un script que creará un archivo en el servidor y luego usar header() para redirigir al usuario a ese archivo. Luego, después de unos 10 segundos, quiero eliminar el archivo. He intentado esto:Continuar ejecutando un script php después de que se devuelva la página

header('Location: '.$url); 
flush(); 
sleep(10); 
unlink($url); 

Pero el navegador simplemente espera a que la secuencia de comandos para completar a continuación, se le redirecciona, pero los archivos hes sido eliminados por ese tiempo. ¿Hay alguna forma de decirle al navegador "fin del archivo", y luego continuar con la informática? ¿O tal vez PHP tiene que iniciar otro script, pero no esperar a que el script termine?

Respuesta

0

Usted puede intentar hacer algo bajo esa manera:

<iframe src="<?=$url?>"></iframe> 

.... 
<? 
sleep(10); 
unlink($url); 
?> 

Otra opción es utilizar rizo - a continuación, se carga el archivo en la solicitud y ser presentado al usuario.

Pregunta: ¿Desea eliminar el archivo que el usuario no puede tener? Me temo que es imposible, cuando el usuario carga el archivo está temporalmente en su navegador, para que pueda guardarlo.

Opción siguiente: si conoce el tipo de este archivo, puede generar un encabezado de contenido/tipo para que el usuario descargue el archivo. Y luego lo borras.

Es sólo ideas simples, no sé lo que funciona para usted (si lo hay :))

1

La única manera que he descubierto para hacer esto hasta ahora es el de proporcionar la longitud del contenido en la cabecera. Intente agregar esto:

header("Content-Length: 0"); 

antes de su descarga();

4

Es mejor que la página PHP sirva al archivo. No es necesario crear un archivo temporal en este caso y eliminarlo, solo envíe los datos que tenía la intención de escribir en el archivo temporal. Tendrá que configurar los encabezados correctamente para que el navegador pueda identificar el tipo de archivo que está enviando. es decir, Content-Type: text/xml; para xml o image/jpeg para jpg's.

Este método también maneja clientes lentos que demoran más en descargar el archivo.

+0

Sí, la creación de una página y luego destruirlo es una pérdida de recursos, solo imprime este archivo al usuario, mata dos pájaros con 1 piedra. Si está intentando hacer algo como generar un CSV, imprimirlo en el navegador sigue siendo la mejor manera. – TravisO

1

alternativa .... en lugar de jugar con los archivos que generan dinámicamente sobre la marcha ... ¿por qué no hacen un controlador de este modo:?

tempFile.php clave = {} hash MD5

de archivo temporal. php luego consulta un DB, Memcache (con una clave adicional añadida) o una APC para el contenido.

-1

Estás haciendo esto de la manera incorrecta. Puede crear el archivo y servirlo, y eliminarlo en un solo paso.

<?php 
$file_contents = 'these are the contents of your file'; 
$random_filename = md5(time()+rand(0,10000)).'.txt'; 
$public_directory = '/www'; 
$the_file = $public_directory.'/'.$random_filename; 
file_put_contents($the_file, $file_contents); 
echo file_get_contents($the_file); 
unlink($the_file); 
?> 

Si lo hace de esa manera, los archivos se eliminan inmediatamente después de que el usuario los vea. Por supuesto, esto significa que el archivo no necesita existir en primer lugar.Por lo que podría acortar el código para esto:

<?php 
$file_contents = 'these are the contents of your file'; 
echo $file_contents; 
?> 

Todo depende de donde está recibiendo el contenido que desea mostrarlos. Si es de un archivo, intente:

<?php 
$file_contents = file_get_contents($filename_or_url); 
echo $file_contents; 
?> 

En cuanto a la eliminación de archivos de forma automática, acaba de configurar una tarea programada que se ejecuta cada 10 segundos, y elimina todos los archivos de la carpeta de archivos temporales que, cuando filemtime ($ archivo) es mayor de 5 minutos en segundos.

0

Si desea implementar su diseño original, leer esta pregunta acerca de cómo ejecutar un comando en PHP que es "dispara y olvida" Asynchronous shell exec in PHP

0

Como se ve en \Symfony\Component\HttpFoundation\Response::send

/** 
* Sends HTTP headers and content. 
* 
* @return Response 
* 
* @api 
*/ 
public function send() 
{ 
    $this->sendHeaders(); 
    $this->sendContent(); 

    if (function_exists('fastcgi_finish_request')) { 
     fastcgi_finish_request(); 
    } elseif ('cli' !== PHP_SAPI) { 
     // ob_get_level() never returns 0 on some Windows configurations, so if 
     // the level is the same two times in a row, the loop should be stopped. 
     $previous = null; 
     $obStatus = ob_get_status(1); 
     while (($level = ob_get_level()) > 0 && $level !== $previous) { 
      $previous = $level; 
      if ($obStatus[$level - 1]) { 
       if (version_compare(PHP_VERSION, '5.4', '>=')) { 
        if (isset($obStatus[$level - 1]['flags']) && ($obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)) { 
         ob_end_flush(); 
        } 
       } else { 
        if (isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) { 
         ob_end_flush(); 
        } 
       } 
      } 
     } 
     flush(); 
    } 

    return $this; 
} 
Cuestiones relacionadas