Caché de imagen local para imágenes externas -- php campo con cache camp codereview Relacionados El problema

Local image cache for external images


3
vote

problema

Español

He escrito un script de caché de imágenes simple, el propósito es cargar la imagen localmente, por lo que puedo controlar los tiempos de caché de las imágenes, y tengo mejores horarios de carga que el servidor host, (Battle.net sirve 350 ms de 350 ms , Sirvo 65ish MS) Esta Times 20 imágenes es un paso de rendimiento bastante bueno.

Pero siendo el fanático del rendimiento que soy. Me preguntaba si puedo hacerlo correr más rápido!

Por favor, también incluya lo siguiente en la revisión:

  • mejores sugerencias para los nombres de la función / variable.
  • mejor escritura de código.
  • Formato alternativo.
  • algo que podría cambiarse para algo mejor / más correcto.
  • Sugerencias sobre cómo hacer esto genérico / reutilizable.
  • una explicación sobre por qué tienes razón.
  • Una explicación por la cual usted vence esta publicación.

Así que todos podemos aprender de esto.

Los comentarios son solo para la revisión del código y no en realidad en el archivo.

  a36  
Original en ingles

I have written a simple image cache script, the purpose is to load the image locally, so i can control the cache times of the images, and i have better load times than the host server, (battle.net serves 350 ms, i serve 65ish ms) this times 20 images is a pretty good performance step.

But being the performance freak i am. I was wondering if i can make it run faster!

Please also include the following in the review:

  • Better suggestions for function/variable names.
  • Better writing of code.
  • Alternate formatting.
  • Something that could be changed for something better / more correct.
  • Suggestions about how to make this generic / reusable.
  • An explanation about why you are right.
  • An explanation why you down vote this post.

So we all can learn from this.

Comments are only for Code Review and not actually in the file.

<?php // Checks if the img parameter is set.  if(!isset($_GET['img'])){     die; } // Saves it as a variable $url = $_GET['img']; // Compiles the local file string $img = dirname(__FILE__) . '/media/cache/' . get_image_from_url($url);  // Check if the file exists, if not it dowloads a version of the image. if(!file_exists($img)){     // log_message('info', 'file does not exists');    download_image($img, $url); }  // Checks if the image existing is more than 24 hours old if it is gets a new image. if(time()-filemtime($img) > 24 * 3600){   //  log_message('info', 'file is too old');     download_image($img, $url); }  header('Content-Type: image/jpeg'); $handle = imagecreatefromjpeg($img); imagejpeg($handle);  /*  * FUNCTIONS  */  function get_image_from_url($url){     $url = str_replace('http://eu.battle.net/static-render/','', $url);     $url = str_replace('/','-',$url);     return $url;    }  function download_image($img, $url){     $headers = get_headers($url);     $response_code = substr($headers[0], 9, 3);      if($response_code == '404'){          // Pleas also advice here to make the file more generic.         $url = 'http://localhost/warlords' . '/media/images/anonymous.jpg';     }      $thisurl = file_get_contents($url);         file_put_contents($img, $thisurl);    } 
     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Cuando quiero almacenar en caché algún archivo, normalmente lo estoy haciendo similar a su solución.

Sin embargo, usted puede hacer la mayor parte de esto con la funcionalidad incorporada, lo que hace que el código sea mucho más corto:

  <?php // Some URL for testing $url = 'https://www.google.de/favicon.ico';  // Time to cache the files (here: 10 minutes) define('time_to_cache', 600);  // Create a local file representation $local = './cache/' . urlencode($url);  // Determine whether the local file is too old if (@filemtime($local) + time_to_cache < time()) {     // Download a fresh copy     copy ($url, $local);      // Store headers in case we need them (see alternative below)     file_put_contents($local . '.hdr', join($http_response_header, " ")); }  // Solution 1: Redirect to the local cache file header('Location: ' . urlencode($local)); exit();  // Alternative: Send headers and the actual file // Note that this might cause problems, e.g. due // to cache fields and the like.  // Read and send headers foreach(file($local . '.hdr') as $line)     header($line);  // Read and send the actual file readfile($local);   

Esto no incluye ningún manejo de errores.

Para el manejo de errores, es posible que desee verificar los resultados del funcionamiento copy() . No es necesario solicitar a los encabezados con anticipación o hacer algo así, ya que eso esencialmente le demorará dos veces.

con respecto a su implementación anterior:

  • No revises primero los encabezados. Solo intenta descargar el archivo. Esto se tomará al mismo tiempo. Si solicita los encabezados primero, harrá dos solicitudes, cada una de las cuales podría demorar con la mencionada 200-300 ms.

  • He usado urlencode() para crear un nombre de archivo local de trabajo. Esto podría no ser perfecto, dependiendo de su sistema de archivos real, sin embargo.

  • No verifique si su archivo local existe primero; No tienes que hacerlo. Solo puede preparar filemtime() por un @ , que evitará que salga de cualquier mensaje de error y aún devuelva 0 en caso de que el archivo no existen (que simplemente serán interpretados como el archivo que es antiguo).

  • ¿Por qué lees el JPEG de su disco local y luego lo reencodifiquen como una nueva imagen que se enviará al navegador? Simplemente envíe el contenido del archivo real (o redirige el navegador). Los siguientes hará lo mismo sin reencodicar la imagen:

      header('Content-type: image/jpeg'); readfile($local);   
 

When I want to cache some file, I'm typically doing it similar to your solution.

However, you're able to do most of this with built-in functionality, making the code a lot shorter:

<?php // Some URL for testing $url = 'https://www.google.de/favicon.ico';  // Time to cache the files (here: 10 minutes) define('time_to_cache', 600);  // Create a local file representation $local = './cache/' . urlencode($url);  // Determine whether the local file is too old if (@filemtime($local) + time_to_cache < time()) {     // Download a fresh copy     copy ($url, $local);      // Store headers in case we need them (see alternative below)     file_put_contents($local . '.hdr', join($http_response_header, "\n")); }  // Solution 1: Redirect to the local cache file header('Location: ' . urlencode($local)); exit();  // Alternative: Send headers and the actual file // Note that this might cause problems, e.g. due // to cache fields and the like.  // Read and send headers foreach(file($local . '.hdr') as $line)     header($line);  // Read and send the actual file readfile($local); 

This doesn't include any error handling though.

For error handling, you might just want to check the results of the copy() operation. There's no need to request headers in advance or doing anything like that, since that will essentially delay you twice.

Regarding your implementation above:

  • Don't check the headers first. Just try downloading the file. This will take the same time. If you request headers first, you'll do two request, each of which might delay you by the mentioned 200-300 ms.

  • I've used urlencode() to create a working local filename. This might not be perfect depending on your actual file system though.

  • Don't check whether your local file exists first; you don't have to. You can just prepend filemtime() by an @, which will keep it from outputting any error messages and still return 0 in case the file doesn't exist (which will simply be interpretes as the file being ancient).

  • Why do you read the JPEG from your local disk and then reencoding it as a new image to be sent to the browser? Just send the actual file contents (or redirect the browser). The following will do the same without reencoding the image:

    header('Content-type: image/jpeg'); readfile($local); 
 
 
         
         

Relacionados problema

2  Objeto de búsqueda de la base de datos, o fetchlo usando una API si no está ahí  ( Fetch object from database or fetch it using an api if it isnt there ) 
Para dar algunos antecedentes en este código en particular, hay un controlador que recibe un objeto, las partes de los hashes y se analiza en una base de dato...

3  Implementando una fábrica segura de hilo con almacenamiento en caché  ( Implementing a thread safe factory with caching ) 
Tengo un 9988776655544330 que crea Connector Objetos basados ​​en parámetros como URL, nombre de usuario y contraseñas. El Connector2 El objeto implem...

13  Funda de prueba para una biblioteca de almacenamiento en caché  ( Test case for a caching library ) 
Esto muestra un caso de prueba para una antigua biblioteca de almacenamiento en caché que uso para un proyecto. Cuenta con funciones simples de guardar / carg...

5  Cachill genérico IEnumerable <T>  ( Generic cached ienumerablet ) 
Tengo una fuente 9988776655544330 que lleva tiempo para generar cada elemento. Una vez que se genera un artículo, quiero cambiarlo para evitar la recompensa...

2  Cómo crear una clase de caché sin estado simple en PHP  ( How to create a simple stateless cache class in php ) 
Necesito crear una clase de caché para evitar hacer los mismos cálculos más de lo necesario. Mi idea era algo realmente básico como class transient_cache {...

5  Alcanzar un objeto grande en el entorno multithreading  ( Caching large object in multithreading environment ) 
Estoy teniendo que desbordarse con el almacenamiento en caché y el multithreading (hilo por solicitud), y soy un principiante absoluto en esa área, por lo que...

3  Caché Azure GetLeradd (sin bloqueo)  ( Azure cache getoradd without locking ) 
inspirado en la implementación no bloqueada propuesta en esta publicación , el siguiente código es un intento de (acerca de) hacer lo mismo utilizando el ca...

11  LinkedHashMap como caché LRU  ( Linkedhashmap as lru cache ) 
Tengo una implementación simple para un caché LRU usando LinkedHashMap . Quiero que sea lo más genérico posible. Esto no es para uso de la producción, s...

3  Valores de búsqueda en caché en un sitio web de comercio electrónico  ( Caching lookup values in an e commerce website ) 
Estoy trabajando en un sitio web de comercio electrónico. Tengo un desplegamiento 99887766555443344 que contiene nombres de automóviles y su ID correspondie...

7  Almacenamiento de caché de objeto para carriles  ( Object cache storage for rails ) 
Quiero tener caché rápido en el que quiero mantener todos mis datos de nomenclatura. No quiero ir con memcached porque tengo que hacer serialize / de-serializ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos