Mise en cache PHP et librairie GD, est ce correct svp ?

WRInaute discret
Bonjour,

j'ai besoin d'afficher une image personnalisée par un texte (selectionné dans ma base de données), j'utilise donc la librairie GD :

Code:
<?php
header ("Content-type: image/jpeg");
$image = imagecreatefromjpeg("image.jpg"); 

$couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc

imagestring($image, 4, 35, 15, "Mon texte ici !", $couleur_texte);

imagejpeg($image);
?>

Je veux mettre ceci en cache en suivant cette astuce :
https://www.webrankinfo.com/forum/t/script-mise-en-cache-des-pages-php.28614/
Ce qui donne :

Code:
<?PHP 
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page 
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier 
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html 
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page 
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré 
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur 

// ici vient normalement la selection du texte dans la base de données, pour l'exemple je met seulement [b]Mon texte ici ![/b]

// création de l'image avec le texte
header ("Content-type: image/jpeg");
$image = imagecreatefromjpeg("image.jpg"); 

$couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc

imagestring($image, 4, 35, 15, "[b]Mon texte ici ![/b]", $couleur_texte);

imagejpeg($image);
// fin de la création de l'image, on reprend le cache

$contenuCache = ob_get_contents(); // on recuperre le contenu du buffer 
   ob_end_flush();// on termine la bufferisation 
   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache 
   if ($fd) { 
      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache 
      fclose($fd); 
     } 
} else { // le fichier cache existe déjà 
  include ($fichierCache); // on le copie ici 
} 
?>

En tout il y'a pas plus de 145 images crées (car 145 textes différents dans ma base de données).

Ce que je souhaite c'est que ça consomme sur le serveur pas beaucoup plus que l'appel d'une simple image.jpg, donc qu'il y'ait un seul fichier cache par image personnalisée par la librairie GD.

Donc une foi la création du cache d'une image, qu'il y ait aucune requête sql ou php autre que la vérif du cache avec php.

Est ce correct comme ceci ou gourmand en ressource serveur ?

Désolé mon post est un peu long mais je suis pas très sûr là.

Merci
 
WRInaute passionné
Bonjour kinteba! (ba pla! :wink: )

Il me semble que tu confonde la mise en cache d'une page html et la mise en cache d'une image. Dans le cas qui t'interesse, le code correct est:

Script (image.php) de génération de l'image ou mesimages est le répertoire où est stockée l'image originale et cache le répertoire où sera stockée l'image modifiée
Code:
<?php 
$image = imagecreatefromjpeg("/mesimages/".$_GET['image']); 
$couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc 
imagestring($image, 4, 35, 15, "Mon texte ici !", $couleur_texte); 
imagejpeg($image,"/cache/".$_GET['image'],100); 
header("Content-Type: image/jpeg");
imagejpeg ($image);
imagedestroy($image);
?>

Ce script stocke l'image modifiée dans le dossier cache et affiche cette image modifiée.

Dans ta page, tu mets le code suivant:
Code:
<?php if(file_exists($chemindepuislaracine."/cache/".$image)) { ?>
<img src="/cache/.$image">
<?php } else { ?>
<img src="image.php?image=<?php echo $image;?>">
<?php } ?>

$image contient le nom du fichier image, image.php est le nom du script de génération de l'image modifiée et $chemindepuislaracine est le chemin depuis la racine de ton serveur (par exemple /home/www)

Ce code teste si l'image modifiée existe et dans ce cas, l'affiche, sinon il fait appel au script de génération de l'image modifiée.

aller, adichatz! :D
 
WRInaute discret
fandecine a dit:
Bonjour kinteba! (ba pla! :wink: )
Bien vue lol

Merci beaucoup pour ton aide, comme tu dis je confonds, je suis même largué là :lol:

Dans ton exemple c'est idéal pour faire ça avec une image interne mais pour une image qui est à destination d'un utilisateur qui va la placer sur son site ça va pas le faire. j'imagine que je dois mettre en place tes 2 codes dans le même fichier (image.php). Donc pour utiliser le cache et éviter que la librairie GD créait l'image à chaque foi je dois faire comme ceci dans image.php ?

Code:
<?php 
$image = $_GET['image']; //renvoi l'ID du texte à afficher (qui est aussi le nom de l'image)
if(file_exists($chemindepuislaracine."/cache/".$image)) { ?> 
<img src="/cache/.$image"> 
<?php } else { 

// mon code php pour selectionner le texte dans la base de données

?> 
<img src="image.php?image=<?php echo $image;?>"> 
<?php 

$image = imagecreatefromjpeg("/mesimages/".$_GET['image']); 
$couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc 
imagestring($image, 4, 35, 15, "Mon texte ici !", $couleur_texte); 
imagejpeg($image,"/cache/".$_GET['image'],100); 
header("Content-Type: image/jpeg"); 
imagejpeg ($image); 
imagedestroy($image); 
}
?>

J'ai correct là pour afficher l'image depuis le cache et si elle n'existe pas la créer dans le cache ?
Les visiteurs peuvent copier sur leur disque dur ou sur leur site l'image personnalisée avec la librairie GD ?

Ou peut être que je peux séparer dans 2 fichiers le 1er code dans image.php et celui ci-dessous dans image2.php :

Code:
<?php 
$image = $_GET['image'];

if(file_exists($chemindepuislaracine."/cache/".$image)) { ?> 
<img src="/cache/.$image"> 
<?php } else { ?> 
<img src="image.php?image=<?php echo $image;?>"> 
<?php } ?>

Je ne sais pas quelle est la meilleure solution et si j'ai juste déjà lol ?

Merci

Aller, Adiu ! :wink:
 
WRInaute passionné
Houlala! Tu compliques tout! Tu dois pas être 100% Béarnais! Des ancêtres basques peut-être! :lol: :lol: :lol:

Si tu veux que les images soient utilisées de façon transparente sur d'autres sites il te faut ajouter un peu de rewriting!

Et pour fusionner les scripts en un seul voici le code correct:

Code:
<?php 
$image = imagecreatefromjpeg("/mesimagesoriginales/".$_GET['image']); 
$couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc 
imagestring($image, 4, 35, 15, "Mon texte ici !", $couleur_texte); 
if(!file_exists($chemindepuislaracine."/cache/".$_GET['image'])) { ?> 
       imagejpeg($image,"/cache/".$_GET['image'],100); 
 }
header("Content-Type: image/jpeg"); 
imagejpeg ($image); 
imagedestroy($image); 
?>

Si tu appelle ce script image.php dans le htaccess tu met:

Code:
RewriteRule ^mesimages/([0-9a-zA-Z_]+)\.jpg$ /image.php?image=$1 [QSA,L]

Pour afficher une de tes images modifiées, il suffit de mettre dans une page html interne ou externe à ton site:

Code:
<img src="http://www.tondomaine.com/mesimages/nomdelimage.jpg">

Remarque: mesimages est un répertoire virtuel, sans existance physique réelle.

Tout bien réfléchi, tu doit être un peu Landais plutôt! :wink:
 
WRInaute discret
Enorme merci ça a l'air de fonctionner :p

Quelques précisions stp sans vouloir faire le boulet, histoire de bien piger ce bout de code car je vais mettre des instructions SQL, donc autant les mettre où le code n'est exécuté que quand il n'y a pas de cache pour l'image en question.

Code:
if(!file_exists($chemindepuislaracine."/cache/".$_GET['image'])) { 
       imagejpeg($image,"/cache/".$_GET['image'],100); 
 }
En gros ceci dit "si le fichier cache/monimage.jpg n'existe pas, il faut le créer ?

Code:
header("Content-Type: image/jpeg"); 
imagejpeg ($image); 
imagedestroy($image);
Cette partie est éxécuté si le fichier en cache n'existe pas et n'est pas exécuté si le fichier en cache existe ?

Houlala! Tu compliques tout! Tu dois pas être 100% Béarnais! Des ancêtres basques peut-être! :lol: :lol: :lol:
Ayant grandit à environ 4km du Pays Basque, il y'a peut être eu des croisement :?

Tout bien réfléchi, tu doit être un peu Landais plutôt! :wink:
Là tu y vas fort, à part les plages Landaise et le maïs, aucune affinité particulière :lol:
 
WRInaute passionné
C'est ok! tu as tout pigé au quart de poil! :wink:

Moi je vie en zone frontière (en pays charneigue, le ventre mou entre le bearn et le pays basque, tu sais, entre les deux gaves,mais coté béarn quand même! :lol: )

aller, adichatz tots! (je suis curieux de voir comment ggogle vas référencer ce post!? sur google.bearn peut-être! :lol: :lol: :lol: )
 
WRInaute discret
Cool, il m'a fallu une journée pour comprendre mais c'est rentré lol 8)
Encore merci pour ton aide ce bout de code m'est très utile :wink:

Entre 2 gaves... ce n'est pas Oloron quand même ? ^^

je suis curieux de voir comment ggogle vas référencer ce post!? sur google.bearn peut-être!
Vue qu'il y'a pas mal de fois libraire ainsi que cache et béarne ça pourrait bien resortir sur la requête "librairie caché dans le béarne" :roll:
 
WRInaute passionné
kinteba a dit:
Entre 2 gaves... ce n'est pas Oloron quand même ? ^^

tss, tss! les gaves se reunissent à peyrehorade, avant le gave de pau passe à orthez et celui d'oloron à sauvettere. Et qu'est ce qu'il y a entre les deux? :wink:

Aller rendez-vous à la heste de la saü le 10 septembre... :D
 
WRInaute discret
En même temps c'était la question piège, ici les gaves se rejoingnent partout. A Oloron il y'a le gave d'Aspe et celui d'Ossau qui se rejoingnent pour faire le gave d'Oloron.

Et qu'est ce qu'il y a entre les deux? :wink:
Navarrenx :roll:
 
Discussions similaires
Haut