Page 1 sur 1

PB de mise en cache apache ou php

Publié : jeu. 9 avr. 2009 16:55
par nidosaur
Bon je vais essayer d'expliquer le truc assez clairement
j'ai récupéré en hebergement un serveur Apache (jusque la c'est simple)
il est blindé de vhost et a une conf bien bordellique.

Le probleme c'est qu'une grande partie des images générées dynamiquement ne sont pas mise en cache (et il faudrait qu'elle le soit car elle bouffe des threads et du cpu sur un serveur qui est full)

Les images sont appellées de la maniere suivante /toto/image.jpg

sauf que l'image est pas dans toto, dans /toto on trouve un .htaccess qui appelle un script php qui genere l'image.

quand j'essaye de setter Last-Modified ou Etag dans le script de generation de l image, les headers sont dégagés (et je sais pas pourquoi) et forcément aucune mise en cache n'est faite.

Si quelqu'un a une idée pour forcer le cache ?!?


Les modules Apache
core prefork http_core mod_so mod_authz_host mod_actions mod_alias mod_auth_basic mod_authz_groupfile mod_authn_file mod_authz_user mod_autoindex mod_cgi mod_dir mod_env mod_include mod_log_config mod_mime mod_negotiation mod_setenvif mod_status mod_userdir mod_asis mod_cache mod_disk_cache mod_imagemap mod_mem_cache mod_proxy mod_proxy_connect mod_proxy_ftp mod_proxy_http mod_rewrite mod_ssl mod_php5 mod_authz_default

PB de mise en cache apache ou php

Publié : jeu. 9 avr. 2009 20:24
par biour
faudrait voir avec Ivanlefou, il a un peu bidouillé pour faire des banniere ds Stat, mais en ce moment il est plus tot OQP

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 08:26
par fighting_falcon
tu modifies ton script PHP ...

1/ si l'image n'existe pas, je la créée, l'enregistre dans un dossier temporaire (genre /tmp ou /var/tmp) puis l'envoie au client
2/ si l'image existe, et qu'elle n'est plus valide (à définir), je la supprime du cache puis 1/
3/ l'image existe, elle est valide => j'envoie direct le contenu du fichier en cache

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 15:21
par nidosaur
le pb c'est pas la generation ou la validation de l image générée, le pb c'est qu'elle n'est pas mise en cache !

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 15:32
par nicodache
et sais-tu seulement comment vérifier si une image existe déja ?
genre un nom unique en fonction de l'image de base et des transformations appliquées ?

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 17:43
par fighting_falcon
le pb c'est pas la generation ou la validation de l image générée, le pb c'est qu'elle n'est pas mise en cache !
j'ai bien compris, ce que je te propose, c'est de modif ton script PHP qui génère tes images pour en plus les mettre en cache ...

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 17:43
par nicodache
et qu'il vérifie si elles sont pas déjà en cache avant de les générer :D

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 18:27
par fighting_falcon
of course ;)

PB de mise en cache apache ou php

Publié : mar. 14 avr. 2009 18:34
par fighting_falcon
ceci dit, doit aussi y'avoir moyen d'utiliser des trucs tout fait pour ça ... genre memcache, eAccelerator, mmTurck, APC ...


Mediawiki utilise ce genre de choses, faudrait pi être matter le code, doit y avoir des trucs intéressants ...

PB de mise en cache apache ou php

Publié : mer. 15 avr. 2009 09:05
par nidosaur
et sais-tu seulement comment vérifier si une image existe déja ?
genre un nom unique en fonction de l'image de base et des transformations appliquées ?
le pb vient pas du php (la generation des miniatures ou de leur mise a jour fonctionne bien), il vient plutot d'apache ou d'un de ses modules qui degagent tout ce qui est necessaire au niveau des headers pour permettre la mise en cache.
J'ai essayé d'ajouter les headers Last-Modified ou Etag a la generation 'image et une fois arrivé dans mon navigateur ces headers n'apparaissent pas.
        function display_thumb($pic) {
           ob_start();
           header("Content-type: image/jpeg");
header("Last-Modified: ".date('D, d M Y H:i:s', filemtime($pic))." GMT");
$etag = md5_file($file);
header("Etag: $etag");
           $source = imagecreatefromjpeg($pic);
           $im = imagejpeg($source);
           $buffer = ob_get_contents();
           ob_end_clean();
           echo $buffer;
        }
        if($is_file||$result) {
                display_thumb($file_path) ;
        }


PB de mise en cache apache ou php

Publié : mer. 15 avr. 2009 15:46
par fighting_falcon
Peux tu tester cette version :
        function display_thumb($pic) {
           header("Content-type: image/jpeg");
           header("Last-Modified: ".date('D, d M Y H:i:s', filemtime($pic))." GMT");
           header("Etag: ".md5_file($file));
           $source = imagecreatefromjpeg($pic);
           echo imagejpeg($source);
           exit();
        }
        if($is_file||$result) {
                display_thumb($file_path) ;
        }
les headers dans le ob_start() / ob_end_clean() je ne pense pas que ça soit une bonne chose
et d'autre part, je ne vois pas l'utilité de ces fonctions ici ...