2010-05-13 5 views
7

hice un resizer de imagen en php. Cuando se cambia el tamaño de una imagen, almacena en caché un nuevo archivo jpg con las nuevas dimensiones. La próxima vez que se llama a la exacta img.php? File = hello.jpg & size = 400 comprueba si ya se ha creado el nuevo jpg.¿Cuál es más eficiente/más rápido al llamar a una imagen en caché?

  1. Si NO se ha creado aún, crea el archivo y luego imprime la salida (frío).
  2. Si YA EXISTE, no es necesario generar ningún archivo nuevo y, en su lugar, solo llama al archivo ya en caché.

Mi pregunta está relacionada con el segundo escenario. ¿Cuál de estos es más rápido?

  1. redireccionamiento: header('Location: cache/hello_400.jpg');die();
  2. agarrar los datos e imprimir el archivo en caché: $data = file_get_contents('cache/hello_400.jpg'); header('Content-type: '.$mime); header('Content-Length: '.strlen($data)); echo $data;

Cualesquiera otras maneras de mejorar esto?

Si alguien quiere el código generado, mira esto: http://egobits.com/misc/img.phps

Gracias a todos por la ayuda!

+0

Una buena pregunta (no estoy seguro de cuál es más rápido). – JYelton

Respuesta

3

Cualesquiera otras maneras de mejorar esto?

Sí.

No es una forma de enviar nada más que simplemente una cabecera HTTP: GET condicional una .
Usted puede echar un vistazo a la secuencia de comandos similares, http://shiftingpixel.com/2008/03/03/smart-image-resizer/, para la ejecución

+0

Esto funcionó perfectamente. Si la imagen no existe, la secuencia de comandos crea la nueva img redimensionada y la almacena en la caché. La próxima vez que solicite el mismo enlace, la secuencia de comandos sirve para el navegador img en caché. Gracias. – andufo

+0

Si alguien quiere el código generado, consulte esto: http://egobits.com/misc/img.phps – andufo

+0

Es posible que desee examinar el uso de readfile() en lugar de file_get_content porque el archivo completo nunca se carga en php y se envía directamente al usuario –

5

optaría por no imprimir los datos al navegador. Ambos escenarios deberían arrojar una redirección permanente a la imagen generada. Excepto si la imagen aún no existe, se crea antes de que se envíe el encabezado de Ubicación.

Editar:

Para ser claros acerca de lo que quiero decir con redirección permanente ...

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 
+0

para agregar a Matt, puede almacenar en caché la imagen a través de los puntos de Internet desde el navegador al servidor proxy. – Rohit

0

Como tercera opción (más potente): cache la imagen en un campo binario en una base de datos, y consultar la base de datos para ello.

Implementar las tres soluciones de referencia y ellos.

Voy a adivinar que la primera opción (redirección) será la más lenta en el mundo real, porque requiere tanto esfuerzo como la segunda opción (file_get_contents), pero implica una segunda solicitud y más sobrecarga.

5

Tal vez usted podría hacer lo siguiente:

  1. Establecer algún directorio para estas imágenes.
  2. Enlace a las imágenes en este directorio (<a href="/img/resizable/hello_400.jpg>).
  3. Configure su servidor web para redirigir a su script php si la imagen aún no existe. Si está en Apache, un simple .htaccess servirá. En PHP, tiene $_SERVER["REQUEST_URI"] desde el que puede ver qué imagen debe cambiar de tamaño.
  4. Su secuencia de comandos guarda y repite la imagen (pero se llama solo por primera vez).

De esta manera, el llegar algunos beneficios:

  • La imagen se almacena en caché (en un proxy o un navegador) como cualquier otro archivo estático.
  • PHP no tiene que ser llamado para cada solicitud solo para redirigir o generar datos estáticos.
  • Deja la implementación de If-modified-since y otros encabezados relacionados con caché en el servidor web.
  • Y los enlaces se ven más bonitas :-)

Ejemplo .htaccess en su/img/carpeta de tamaño variable:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* /img.php [L] 
+0

+1 Acepto. Delegue en Apache tanto como sea posible, solo llame a PHP cuando realmente lo necesite. – Matt

0

Si es posible, en su caso, también se puede implementar una función para establecer directamente la url de la imagen almacenada en caché en su hTML como:

<img src="<?php getImageUrl('hello.jpg', 400); ?>" /> 

getImageUrl() devolverá el url de la imagen en caché si existe otra cosa que devolverá la url para dinámicamente ge nerate la imagen redimensionada.

Cuestiones relacionadas