Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Duda con caché de documentos PDF en Symfony

20 de febrero de 2015

Saludos

Tengo una duda/problema.

Tengo carga de documentos PDF en la aplicación y funciona correctamente. El problema surge cuando quiero cambiar ese documento, en este caso PDF. Pasos:

  1. Sube documento y cambia nombre predefinido.
  2. Sobreescribe documento existente.

Al revisar el enlace al documento dentro de la aplicación todavía muestra el documento anterior, pero al revisar el documento donde está almacenado es el documento más reciente.


Respuestas

#1

Como dices que el archivo PDF nuevo se sube y se guarda bien, suponemos que, como dices, se trata de un problema de caché. Pero no sabemos qué caché es la que está afectando realmente.

¿Estás usando la caché HTTP de Symfony? ¿Con el proxy inverso de Symfony o con Varnish? ¿Cómo sirves los archivos PDF mediante el servidor web? ¿Tienes activada alguna caché en el servidor web para ese tipo de archivos?

En caso de que estés usando la caché HTTP de Symfony, puedes invocar el método getLog() del kernel que cachea para mostrar toda la información de lo que realmente está pasando en la caché.

Otra cosa que no me queda clara es si al subir un archivo PDF nuevo, al final de todo el proceso el nuevo archivo se renombra para que tenga el mismo nombre que el archivo viejo original. Si es así, puede que se trate de la propia caché del navegador, que piensa que se trata del mismo archivo.

@javiereguiluz

20 febrero 2015, 14:38
#2

1) Uso la cache por defecto de symfony.

2) El nombre del archivo viejo original el cual esta conformado "informe" + "ID informe" + "ID Usuario"., si remplazo el documento conserva el mismo nombre.

Limpie la cache del navegador, y mostro el documento nuevo.

Habra una soluciona para eso.

@dariongg

20 febrero 2015, 14:46
#3

Actualización: he actualizado el contenido de este comentario porque contenía un error en el código Twig, tal y como explica @dariongg en el siguiente comentario.


Como nos dices que el archivo nuevo conserva el nombre del archivo viejo, la solución más sencilla podría ser utilizar la vieja técnica del cache busting. Se trata de añadir un valor aleatorio en el query string del enlace del documento. Al enlace no le afecta en nada y seguirá funcionando bien, pero el navegador pensará que es un documento diferente cada vez y siempre lo bajará, sin tener en cuenta la cache.

Con Twig podrías hacerlo así:

<a href="{{ path('...', { ... }) }}?{{ 'now'|date('U') }}">Informe</a>

La instrucción 'now'|date('U') simplemente genera el timestamp del momento en el que se ejecuta. Así que el resultado sería algo así:

<!-- enlace original -->
<a href="/informes/pdf/informe_20_321.pdf">Informe</a>
 
<!-- enlace con un "query string" aleatorio que desactiva la cache -->
<a href="/informes/pdf/informe_20_321.pdf?1424442340">Informe</a>

@javiereguiluz

20 febrero 2015, 15:27
#4

Gracias con eso resultó.

{#  tiene como resultado algo así: Febrero, 20/02/2015 #}
{{ 'U'|date }}
 
{# devuelve correctamente el timestamp #}
{{ 'now'|date('U') }}

@dariongg

20 febrero 2015, 15:45
#5

¡Tienes toda la razón! El U es el parámetro que formatea la fecha, así que hay que usarlo como tu dices :)

@javiereguiluz

20 febrero 2015, 15:47