2012-02-05 11 views
5

genero dinámicamente gráfico en mi controlador:Symfony - imagen en respuesta - velocidad, optimización

  1. si no existe el archivo (nombre de archivo único) a continuación, generar gráficos y guardarlo

  2. retorno RedirectResponse ($ url)

(3. he intentado también:

$fp = fopen($url, "rb"); 
    $str = stream_get_contents($fp); 
    fclose($fp); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 
    return $response; 

)

Lo necesito para generar dinámicamente barras de usuarios para los usuarios [en este gráfico, algunos textos se actualizarán automáticamente si se realizarán algunos cambios en mis sitios web].

Así que es importante para mí que este script funcione rápido y no mate mi servidor/conmutador de banda. Para lograr eso, hice un caché donde se almacenan todos los gráficos generados. Pero tengo un problema con la velocidad, las soluciones que he descrito arriba son bastante lentas, cuando lo he probado en Chrome con la herramienta de desarrollador (F12), entonces me muestra que ambas soluciones (2. y 3.) aproximadamente ~ 1s (cuando los mismos gráficos [sin controladores, etc. solo dirigen url a .png] cargan 44ms).

Así que si solo para mí toma aproximadamente ~ 1s por gráfico, entonces si, por ejemplo, 1000 usuarios generarán al mismo tiempo este gráfico, puede ralentizar mi sitio web, creo.

Por favor, ayuda, ¿conoces alguna forma más rápida de hacerlo?

PS. Redirigir no es lo más deseado para mí, porque preferiría dejar la URL tal como está, por ejemplo smth/username/userbar/insted of smth/img/userbars/cache/blabla.png. Pero si va a ser mucho más rápido, entonces puedo soportarlo :).

EDITAR: Para ser claros: no estoy buscando una solución a las imágenes de caché, mi problema es que devolver imágenes a través del controlador (imágenes ya generadas, solo desde ftp) toma aproximadamente 1s, cuando normalmente si lo hace por ejemplo

  <img src="direct_url_to_png"> 

toma aproximadamente 44ms.

Respuesta

3

Puede usar Varnish para almacenar en caché las imágenes, Varnish es un proxy HTTP que se encuentra frente al servidor web. Se necesita un poco de tiempo & para configurarlo, pero es una buena pieza de software muy.

Como alternativa, puede almacenar en caché las imágenes en la memoria usando shared memory, memcache o redis. Esto probablemente sería menos eficaz que Barniz, pero salvaría el sistema de archivos IO.

Debe probar en qué se gasta la mayor parte del tiempo, espero que es una combinación del archivo de E/S y PHP tiempo de análisis, pero como dice en holandés, "La medición es saber";)

Aquí es un simple ejemplo que debe dar la idea general sobre cómo hacerlo:

<?php 
class MyClass 
{ 
    function __construct() 
    { 
    $this->timer = array(
     'start' => microtime(True); 
    ); 
    } 

    function myAction() 
    { 
    $this->timer['startaction'] = microtime(True); 

    $fp = fopen($url, "rb"); 
    $this->timer['startstream'] = microtime(True); 
    $str = stream_get_contents($fp); 
    fclose($fp); 
    $this->timer['endstream'] = microtime(True); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 

    $this->timer['endaction'] = microtime(True); 
    print_r($this->timer) 
    return $response; 
    } 
} 

Otra cosa que puede ser una opción es utilizar HTML/CSS para mostrar los gráficos. Esto puede funcionar o no dependiendo de cómo se vean tus gráficos, pero lo he usado anteriormente y funcionó bastante bien.

+0

"es utilizar HTML/CSS para mostrar los gráficos" ¿qué quieres decir? No lo veo porque primero necesito obtener algunas estadísticas de la base de datos, por lo que preferiría pasarlo por Controller. Creo que hay un problema al devolver esta imagen (usando stream_get_contents o redirección que toma aproximadamente 800ms). Por cierto, ¿tal vez estoy totalmente equivocado y mi solución no es tan mala? ¿Si solo afecta la carga de la imagen para el usuario y no ralentizará el servidor de lo que creo que podría ser? Como veo, se centró en almacenar imágenes generadas, pero un problema real es devolver esta imagen :). –

+0

Este tiempo que he anotado anteriormente se refiere a la carga de imágenes desde el caché. Cargar la imagen ya generada desde ftp a través del controlador toma aproximadamente 1s y me gustaría mejorarla. –

+0

Gracias por su asesoramiento, lo he probado y en general no es tan malo. Cuando genero el gráfico por separado, solo carga unos 150 ms (no importa si lo hago mediante redirect o stream_get_contents), así que no es tan malo, creo. Cargarlo directamente lleva unos 32 ms, pero verifico si el archivo existe, obtengo información de la base de datos y obtengo un gráfico, por lo que parece ser bueno. –

Cuestiones relacionadas