Messages : 5
Sujets : 2
Inscription : Dec 2008
Niveau d’avertissement :
0%
30/12/2008, 16:07
(Modification du message : 30/12/2008, 16:13 par LitteulBlack.)
Génération d'une image PHP
Je viens faire part de mon retour d'expérience sur la génération d'une image (php) permettant de voir le contenu en temps réel des messages présent sur un channel.
Explicatif:
Le but est d'utiliser les logs que va créer l'eggdrop évitant la récriture d'un script TCL.
Note importante: Il est obligatoire que l'eggdrop se trouve sur la même machine que le serveur Apache. Une solution est en cours d'écriture pour palier au problème.
Condition:
Le script nécésite la présence de (voir ci-dessous):
Nom du channel: #image
Nombre de log nécessaire: 2
Configuration de l'eggdrop:
Voici la configuration à mettre en place.
Rajouter:
Code : logfile p #image "logs/pimage.log"
logfile o #image "logs/jimage.log"
Attention: Vérifier la valeur de "set max-logs"
Script PHP:
Code PHP : <?php /* * ================================================================ * Génération d'image * ================================================================ * by LitteulBlack <litteulblack@ipbstudio.com> * (c) 2008 LitteulBlack * ================================================================ * Licence : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ * ================================================================ */
// Environement GD2 header ("Content-type: image/png"); putenv('GDFONTPATH=' . realpath('.'));
// Image background $image = imagecreatefrompng("bck_image.png");
// On récupère le fichier log message $file_p = file("../logs/pimage.log");
//---------------------- // Récupération de la dernière ligne // A répéter suivant le nb de ligne à afficher //---------------------- $l1 .= sizeof($file_p)-1; $ligne1 .= $file_p[$l1];
// Suppression de l'heure $ligne1=substr_replace ( $ligne1, "", 0, 8);
// Longeur de la ligne $max=62; if(strlen($ligne1)>=$max) { $ligne1=substr($ligne1,0,$max); $espace=strrpos($ligne1," "); $ligne1=substr($ligne1,0,$espace)."..."; }
// On récupère le fichier log join $file_j = file("../logs/jimage.log");
// Nombre de connecté(s) sur le channel while($row = array_pop($file_j)) { if (preg_match('#\]$#', $row)) { preg_match('#\[m\/([0-9])#', $row, $user); break; } }
// Définition de la couleur et la police d'écriture $color_p = imagecolorallocate($image, 255, 255, 255); $font_p = 'message.ttf'; $color_j = ImageColorAllocate ($image, 255, 255, 255); $font_j = 'users.ttf';
// Insertion du texte imagettftext($image, 10, 0, 60, 34, $color_p, $font_p, $ligne1); // Message ligne 1 imagettftext($image, 8, 0, 151, 16, $color_j, $font_j, $user[1]); // Nombre d'users
// Génération de l'image imagepng($image, "final_image.png"); ?>
------
Extrait de pimage.log
Code : ....
[15:54] <Eggdrop> Bonjour LitteulBlack !!
[15:55] <LitteulBlack> Bonjour Eggdrop :)
------
Extrait de jimage.log
Code : ....
[15:51] Dernier message repété 1 fois.
[15:55] +#image (+trn) : [m/4 o/2 h/0 v/2 n/1 b/0 e/0 I/0]
------
bck_image.png
[Image: http://www.litteulblack.net/share/bck_image.png]
------
final_image.png
[Image: http://www.litteulblack.net/share/final_image.png]
Je vous invite à lire la documentation sur la fonction "imagettftext()" > par ici
Crontab:
Pour permettre de générer un image de façon périodique, j'utilise crontab.
Code : */5 * * * * /usr/bin/php-cgi -f ...image.php
N'oubliez pas de verifier les permissions des fichiers.
------
Si vous avez des questions je suis disponible
Messages : 4
Sujets : 0
Inscription : Oct 2007
Niveau d’avertissement :
0%
Merci LitteulBlack, sa peut être utile.
Messages : 2,345
Sujets : 193
Inscription : Apr 2004
Le script est pas mal, mais à ta place je n'aurais pas utilisé crontab, plutôt une vérification de l'heure de création de l'image (et re-génération si elle est trop vieille) ou mieux encore, récupérer le timestamp de la dernière phrase dite (dans le log pimage.log) et s'en servir pour nommer l'image, comme ça tu peux savoir si cette image a déjà été générée.
Mais très bon boulot, rien à dire.
Messages : 5
Sujets : 2
Inscription : Dec 2008
Niveau d’avertissement :
0%
CrazyCat a écrit :Le script est pas mal, mais à ta place je n'aurais pas utilisé crontab, plutôt une vérification de l'heure de création de l'image (et re-génération si elle est trop vieille) ou mieux encore, récupérer le timestamp de la dernière phrase dite (dans le log pimage.log) et s'en servir pour nommer l'image, comme ça tu peux savoir si cette image a déjà été générée.
Mais très bon boulot, rien à dire.
Ok, mais qui va te relancer ton script php ?
Messages : 2,345
Sujets : 193
Inscription : Apr 2004
30/12/2008, 18:53
(Modification du message : 30/12/2008, 18:54 par CrazyCat.)
Voila l'idée que j'avais:
Code PHP : <?php // Environement GD2 header ("Content-type: image/png"); putenv('GDFONTPATH=' . realpath('.'));
// On récupère le fichier log message $file_p = file("../logs/pimage.log"); $ligne1 = array_pop($file_p); $h1 = str_replace(":", "_", substr($line1, 1, 5));
if (file_exists('final_image_'.$h1.'.png')) { // L'image existe, bien horodatée $image = file_get_contents('final_image_'.$h1.'.png'); echo $image; exit; }
$image = imagecreatefrompng("bck_image.png"); // Suppression de l'heure $ligne1=substr_replace( $ligne1, "", 0, 8);
// Longeur de la ligne $max=62; if(strlen($ligne1)>=$max) { $ligne1=substr($ligne1,0,$max); $espace=strrpos($ligne1," "); $ligne1=substr($ligne1,0,$espace)."..."; }
// On récupère le fichier log join $file_j = file("../logs/jimage.log");
// Nombre de connecté(s) sur le channel while($row = array_pop($file_j)) { if (preg_match('#\]$#', $row)) { preg_match('#\[m\/([0-9])#', $row, $user); break; } }
// Définition de la couleur et la police d'écriture $color_p = imagecolorallocate($image, 255, 255, 255); $font_p = 'message.ttf'; $color_j = ImageColorAllocate ($image, 255, 255, 255); $font_j = 'users.ttf';
// Insertion du texte imagettftext($image, 10, 0, 60, 34, $color_p, $font_p, $ligne1); // Message ligne 1 imagettftext($image, 8, 0, 151, 16, $color_j, $font_j, $user[1]); // Nombre d'users
// Génération de l'image imagepng($image, 'final_image_'.$h1.'.png'); $image = file_get_contents('final_image_'.$h1.'.png'); echo $image; exit; ?>
Et au lieu de générer périodiquement l'image, il suffit d'appeler:
Code : <img src="image.php" />
Bon, c'est une version simpliste qui ne gère que par rapport à la dernière entrée de pimage.log, on peut modifier pour tester par rapport à pimage.log et jimage.log
Messages : 5
Sujets : 2
Inscription : Dec 2008
Niveau d’avertissement :
0%
30/12/2008, 21:34
(Modification du message : 30/12/2008, 21:36 par LitteulBlack.)
Ok pour ton code, mais si je compte utiliser cette image pour le mettre dans une signature de forum je vais être bloqué.
Certains forums interdisent la mise en place d'image php. Donc face à se problème je suis obligé de générer l'image sans l'heure.
L'utilisation de array_pop() pour récupérer la dernier ligne peut poser problème, car il m'arrive d'avoir un retour à la ligne. Il faut utiliser la boucle while comme pour récupérer le nombre de connecté(s).
Merci pour ton retour
Messages : 2,345
Sujets : 193
Inscription : Apr 2004
Donc, comme je te le disais sur IRC, tu as une bonne raison de faire comme tu le fais.
Sinon, avec un petit url-rewriting, tu peux utiliser le script (c'est une solution pour ceux qui n'ont pas accès aux cron mais qui peuvent mettre un .htaccess)
|