PHP: cómo utilizar la sesión en una página mientras se carga otra página con sesión

Estoy utilizando CURL para descargar un archivo grande de una URL externa y guardarlo en mi servidor. Esto puede tardar unos minutos. Mientras se ejecuta la descarga, estoy usando curl_setopt ($ ch, CURLOPT_PROGRESSFUNCTION, ..) para ejecutar una función anónima que actualiza periódicamente mi variable $ _SESSION [‘download_progress’] con la información de descarga actual.

Ahora, todo esto está ocurriendo en el archivo upload.php y mientras el usuario está esperando a que se descargue el archivo, utilizo javascript para solicitar la página progress.php que contiene el siguiente código simple:

session_start(); echo $_SESSION['download_progress']; 

Esto permite que mi código javascript muestre información sobre el progreso de la descarga.

Excepto que no está funcionando.

La página “progress.php” no se cargará hasta que el “upload.php” termine de cargarse (en otras palabras, ambas páginas se carguen solo después de que el archivo haya finalizado la descarga) y esto no es bueno. El session_start () de alguna manera bloquea la carga de la página “progress.php”. Uso mi propio servidor (apache + php 5.4), así que tengo todos los derechos de administrador.

¿Como puedó resolver esté problema? Podría usar alguna solución fea, como escribir la información de descarga en un archivo de texto en lugar de la variable de sesión y luego usar el javascript para leer directamente ese archivo de texto, pero preferiría no hacerlo.

Gracias

    Tienes el problema clásico con las sesiones respaldadas por el sistema de archivos. La secuencia de comandos de carga bloquea el archivo de respaldo de la sesión por su duración, por lo que es imposible obtener acceso a la información de la sesión hasta que se libere el locking.

    Hay varias soluciones posibles aquí, pero la más sencilla sería que su script de carga libere periódicamente la sesión y la vuelva a bloquear; Esto dejaría una oportunidad para que su script de progreso lea la sesión mientras tanto.

    Para liberar el locking de sesión, llame a session_write_close en cualquier momento desde su script de carga. Esto te deja sin acceso a las variables de sesión hasta que vuelvas a llamar a session_start más tarde. Puedes repetir este ciclo todo lo que quieras.

    También hay otras soluciones más capaces. Por ejemplo, podría mover la información de progreso a algún mecanismo de almacenamiento que no permanezca bloqueado durante la duración de un script; puede identificar la información de cada usuario según su ID de sesión (no es necesario que inicie la sesión para obtener su ID, si existe).