Génération image PHP
#1
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):
  • PHP
  • PHP-CGI
  • GD2
  • Crontab

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""08);

// 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($image255255255);
$font_p 'message.ttf';
$color_j ImageColorAllocate ($image255255255);
$font_j 'users.ttf';

// Insertion du texte
imagettftext($image1006034$color_p$font_p$ligne1); // Message ligne 1
imagettftext($image8015116$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 Smile
Répondre Avertir
#2
Merci LitteulBlack, sa peut être utile.
Répondre Avertir
#3
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.
Répondre
#4
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 ?
Répondre Avertir
#5
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($line115));

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""08);

// 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($image255255255);
$font_p 'message.ttf';
$color_j ImageColorAllocate ($image255255255);
$font_j 'users.ttf';

// Insertion du texte
imagettftext($image1006034$color_p$font_p$ligne1); // Message ligne 1
imagettftext($image8015116$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
Répondre
#6
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 Smile
Répondre Avertir
#7
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)
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté