Poster une réponse  Créer un sujet 
Génération image PHP
Auteur Message
LitteulBlack
Junior Member
**


Messages : 5
Groupe : Registered
Inscription : Dec 2008
Statut : Hors ligne
Message : #1
Génération image PHP

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


------
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

Ce message a été modifié le: 30/12/2008 15:13 par LitteulBlack.

30/12/2008 15:07
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Piepierre
Junior Member
**


Messages : 8
Groupe : Registered
Inscription : Oct 2007
Statut : Hors ligne
Message : #2
RE: Génération image PHP

Merci LitteulBlack, sa peut être utile.

30/12/2008 15:19
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
CrazyCat
Administrator
*******


Messages : 1,396
Groupe : Administrators
Inscription : Apr 2004
Statut : Hors ligne
Message : #3
RE: Génération image PHP

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.


Trucs et astuces en programmation - Je suis actuellement
30/12/2008 15:25
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
LitteulBlack
Junior Member
**


Messages : 5
Groupe : Registered
Inscription : Dec 2008
Statut : Hors ligne
Message : #4
RE: Génération image PHP

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 ?

30/12/2008 17:03
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
CrazyCat
Administrator
*******


Messages : 1,396
Groupe : Administrators
Inscription : Apr 2004
Statut : Hors ligne
Message : #5
RE: Génération image PHP

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


Trucs et astuces en programmation - Je suis actuellement

Ce message a été modifié le: 30/12/2008 17:54 par CrazyCat.

30/12/2008 17:53
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
LitteulBlack
Junior Member
**


Messages : 5
Groupe : Registered
Inscription : Dec 2008
Statut : Hors ligne
Message : #6
RE: Génération image PHP

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

Ce message a été modifié le: 30/12/2008 20:36 par LitteulBlack.

30/12/2008 20:34
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
CrazyCat
Administrator
*******


Messages : 1,396
Groupe : Administrators
Inscription : Apr 2004
Statut : Hors ligne
Message : #7
RE: Génération image PHP

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)


Trucs et astuces en programmation - Je suis actuellement
30/12/2008 22:26
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse  Créer un sujet 

Voir une version imprimable
Envoyer ce sujet à un ami
S'abonner au sujet | Ajouter le sujet aux favoris

Aller à :