Armazenando imagens dinâmicas em Rails
-
22-07-2019 - |
Pergunta
Eu estou usando o gem rmagick para gerar imagens dinâmicas de um controlador. O controlador tem um id como um parâmetro, faz um olhar-se em um modelo, escreve texto sobre uma imagem existente, e saídas de TI.
Eu tenho que correr alguns benchmarks comparando gerá-la para cada pedido contra gravação no disco e usando send_data
para a saída-lo se ele já existe. Eu não notei muita diferença em solicitações / segundo entre estes dois métodos.
Existe uma prática recomendada para armazenar em cache a imagem ou gravação em disco em vez de gerar dinamicamente para cada pedido? Uma vez gerado, estas imagens permaneceria na maior parte estática, mas eu também gostaria que a opção de re gerar-lo depois de um certo intervalo de tempo.
Solução
A melhor prática é imagens de cache gerado e permitir que o servidor web para atendê-los.
Use um servidor web como o Apache ou Nginx na frente de sua aplicação Rails, e certifique-se de gravar a imagem para um local onde o servidor pode servi-lo. Portanto, se seus Rails rota avaliada como /dynamic_images/3.png
(que chama dynamic_images_controller
show
ação com id = 3 e format = png), gravação essa imagem para public/dynamic_images/3.png
e uso send_file
no controlador de enviá-lo.
A próxima vez que arquivo é solicitado (/dynamic_images/3.png
), o servidor terá prazer em servi-lo (em cache) eo app Rails nunca vai ter sucesso.
Para as necessidades avançadas, como re-gerar as imagens, e limpar o código do controlador, ter um olhar para o clipe gem .
Outras dicas
Apenas uma idéia (nunca tentou):? Por que não armazenar imagens (especialmente os que são gerados dinamicamente) com memache
Rails.cache.write ( "my_image", imagem)
Você deve colocar imagens em tal diretório em cache a partir de onde serão servidos pelo servidor web. Você não quer usar send_data para isso - que é muito lento. Além disso, você provavelmente vai querer ignorar esse diretório em seu VCS.