Sistema de cache de images - PHP - Portugal-a-Programar
Sistema de cache de images
Gostaria de saber qual será a melhor forma de fazer cache de imagens com PHP. Sei que podemos usar o memcache ou APC mas da vossa experiência qual será o melhor método em termos de eficiência.
1. O PHP recebe o pedido de uma imagem. As imagens podem ter tamanhos entre 1k a 20k. Considerando cerca de 1000 imagens diferentes (umas mais pedidas que outras).
2. Os pedidos são na forma de coordenadas X, Y, Z.
3. O PHP recebe o pedido e encaminha (o PHP serve de proxy) para o servidor de mapas que devolve a imagem.
4. O PHP devolve a imagem para o browser.
Para este sistema de cache, no passo 3, se a imagem existir em cache, devolve logo para o browser e não chega a fazer o pedido ao servidor de mapas.
Se é cache de imagens, eu usava o header do request da imagem apenas.
Sim, também estou a lançar os headers com algum tempo para que o browser também faça uso da cache... ou seja:
Caso 1 - 1º cliente e 1º pedido - PHP pede a imagem ao servidor de mapas, guarda a imagem na cache (APC) e devolve a imagem com headers de cache
Caso 2 - 1º cliente e 2º pedido - o browser não pede as imagens porque já as tem em cache
Caso 3 - 2º cliente (e todos os seguintes) e 1º pedido - o PHP devolve a imagem que tem em cache (não faz pedido ao servidor de mapas)
Caso 4 - browser limpou a cache, ou cache expirou - idem. ao caso 3
Neste momento estou a usar o APC mas se tiverem melhores resultados com o memcache (ou outra coisa) gostava de saber...
Porque é que não guardas simplesmente a imagem no sistema de ficheiros?
Poupas na memória da máquina, poupas no processamento do PHP e é bastante mais rápido - embora talvez tenhas que usar algo melhor que o Apache, o nginx, por exemplo...
Pois tenho que fazer uns testes usando ficheiros... assim como está consigo dar respostas na ordem dos 5 a 15 ms para imagens de ~20k a ler da cache APC (incluindo o tempo de processamento do PHP)...
Hmm... acho que está mais rápido recorrendo a ficheiros... agora tenho que arranjar estratégia para apagar as imagens expiradas...
Vou continuar a testar... obrigadão!
O que é isso de imagens expiradas?
Agora parece que estás a resolver um problema diferente do que aparentas pelo 1º post...
Simula um garbage collector semelhante ao das sessões para as imagens.
As imagens serão guardadas em cache durante um certo tempo... por isso disse imagens expiradas... como é óbvio, o que expira é o tempo em que a imagem é guardada em cache...
Vou ver como se faz isso... obrigado pela dica.
Ok percebi o gc... limpar as imagens é um bocado chato porque terei que eliminar com base no tempo em que a imagem foi criada e terei que calcular 1 a 1... por isso usando a probabilidade de o fazer sera baixa... ou entao uso crons mas prefiro ter essa operação no mesmo sitio onde crio as imagens (no php) por isso vou experimentar usar a probabilidade...
Podes, de vez em quando, iterar por todos os elementos que estão no APC. Os que estiverem expirados são automaticamente apagados.
A frequência em que fazes isso, depende de quanto uso achas que o cache irá ter.
http://php.net/manual/en/class.apciterator.php
meh. Estive a pesquisar mais um pouco, parece que o iterador já n apaga os elementos que expiraram. Isto n é info confirmada, mas é o que encontrei no num cometário no manual.
Edited May 2, 2013 by brunoais
Estou a tentar perceber se usando ficheiros em vez de APC fica mais rapido (parece-me que sim). Assim sendo para apagar tenho que me basear na data de criação de cada ficheiro...
O sistema operativo já tem um cache do disco aceitável, se fosses usar APC seria no servidor que está à frente do utilizador, não nos que estão atrás. Só assim é que ganhas velocidade. Fora isso, não há grande coisa de vantagens em usar apc para cache de imagens. Os headers HTTP + o cache do HDD serve para a maior parte dos casos.