PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Tutorial] Statspicker mit Cache



Gremlin
08.05.2008, 22:04
Hallo,
hier mal ein kleines Tutorial in dem beschrieben wird wie man für das VMS einen ordentlichen Statspicker erstellt der zudem noch gecachet wird wodurch die Serverbelastung minimal bleibt.

Systemvorraussetzungen
- GDLib
- php >= 5

1) Rohling erstellen
Als erstes benötigt man einen Rohling auf diesen werden die Userstatistiken geschrieben. Ich nutze hier eine png Datei 185x50 Pixel

http://primeraclub.de/images/picker/1.png
Picker von PrimeraClub.de


2) Speicherort für Cache erstellen
Damit die gecachten Statpicker auch irgendwo gespeichert werden können brauchen wir einen beschreibbaren ordner. Ich habe dafür den Ordner:

/dynamic_cache/picker/
erstellt, dieser Ordner braucht Chmod 777.

3) PHP Datei für den Picker erstellen
Das Herzstück ist die php Datei welche den Rohling beschriftet und zwischenspeichert diese habe ich picker.php genannt und ins Hauptverzeichnis gelegt.

PNG-Header senden
Als nächstes müssen wir dem Browser sagen das es sich bei der Ausgabe um ein PNG Bild handelt das ganze machen wir mit:


header('Content-Type: image/png');Vorher darf keinerlei Ausgabe stattfinden auch kein Leerzeichen vor <?php.

Prüfen ob Picker schon gecachet wurde und noch aktuell ist
Damit das Script weis ob es den Picker neu erstellen muss oder aus dem Cache laden kann prüfe ich:
a) ob die Cachedatei besteht
b) Bearbeitungszeit der Cachedatei
Wenn die Cachedatei älter als 600 Sekunden (10 Minuten) ist möchte ich sie neu erstellen lassen.



if (!file_exists('dynamic_cache/picker/'.$_GET['uid'].'.png') || @filemtime('dynamic_cache/picker/'.$_GET['uid'].'.png') < time()-600){
Hier ist schon zu erkennen das die Cachedatei z.B. als 1.png für den User mit der ID 1 abgespeichert wird, hierzu später mehr.

Datenbankverbindung aufbauen
Wenn die Cachedatei veraltet ist baue ich die Verbindung zur Datenbank auf um die neuen Daten zu holen.
Damit nicht die komplette functions.lib.php includet werden muss baue ich in dieser Datei die Verbindung direkt mit



$db_host = "localhost";
$db_user = "user";
$db_pass = "passwort";
$db_base = "datenbank";
$db_prefix = "vms";

mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_base);
auf ich habe hier extra die Variablen genommen damit ich bei Änderung schnell mal aus der functions.lib copy paste machen kann.

Ausgabepuffer aktivieren
Mit

ob_start();starte ich den Ausgabepuffer sämtliche Ausgaben an den Clienten werden nicht sofort ausgegeben sondern in dem interenen Puffer gespeichert mehr dazu später.

Daten auslesen
Man kann sämtliche Daten auslesen und ausgeben ich gebe lediglich Nickname und Kontostand aus diese Daten lese ich aus der DB aus:


$stat = mysql_fetch_assoc(mysql_query('SELECT k.kontostand,u.nickname FROM
'.$db_prefix.'_kontodaten AS k
LEFT JOIN '.$db_prefix.'_userdaten AS u ON u.uid = k.uid
WHERE k.uid='.(INT)$_GET['uid'].' LIMIT 1'));Bild erzeugen
Nun kommt der Rohling zum Einsatz mit:

$picker = ImageCreateFromPng('images/picker/1.png');erzeuge ich ein neues Bild in php welches zur weiteren Bearbeitung über $picker ansprechbar ist.

Schriftfarbe
Die Schriftfarbe setze ich mit


$schriftfarbe = ImageColorAllocate($picker,0,0,0);die 3 Zahlen stehen für RGB Werte (http://http://www.farb-tabelle.de/de/farbtabelle.htm) und können beliebig angepasst werden.

Beschriftung
So das wirklich wichtige ist nun die Beschriftung der Daten auf den Statpicker. Hierfür nutze ich wie man schon bemerkt haben dürfte die GDLib diese ist sehr weit verbreitet und reicht für unsere Anforderungen aus. Ich nutze hierfür ImageTTFText() weil ich damit beliebige TTF Schriftarten nutzen kann.

Als erstes schreibe ich in einer großen Schriftart den Nicknamen an den oberen Rand vom Bild:

ImageTTFText($picker,12,0,5,13,$schriftfarbe,"css/trebucbd.ttf",$stat['nickname']);die 12 steht dabei für die Schriftgröße
die 0 steht für eine Drehung der Schrift in ° im Uhrzeigersinn.
die 5 und 13 stehen für den Abstand von x/y Achse
$schriftfarbe haben wir eben oben definiert das färbt also die Schrift schwarz ^^
"css/trebucbd.ttf" gibt den Pfad zur ttf Datei an genügend Fonts gibt es unter http://www.fontasy.de/ da beziehe ich auch meine.
$stat['nickname'] steht einfach für den String der ausgegeben werden soll und kann natürlich durch alles mögliche ersetzt werden.

Dann gebe ich noch Guthaben und Seitenname aus hier nutze ich andere Schriftart, Schriftgröße, Ausrichtung etc. das sieht bei mir dann so aus:


ImageTTFText($picker,8,0,5,26,$schriftfarbe,"css/COMIC.TTF","Guthaben: ".$stat['kontostand']);

ImageTTFText($picker,8,0,5,49,$schriftfarbe,"css/COMIC.TTF","PrimeraClub.de");Bild ausgeben
Mit folgender Zeile gibt das php Script dann das Bild als png an den Browser aus:

ImagePng($picker);
Dann geben wir noch den belegten Speicher frei mit:

ImageDestroy($picker);MySQL Verbindung beenden
Dann noch schön die Datenbankverbindung beenden:

mysql_close(); Bild zwischenspeichern

file_put_contents('dynamic_cache/picker/'.$_GET['uid'].'.png', ob_get_flush() ); mit ob_get_flush() hole ich den Inhalt aus dem Puffer dieser beinhaltet also nun das PNG Bild diesen Speichere ich in dann als png in unserem Cache Verzeichnis. (Hier wird php5 benötigt, php4 kennt file_put_contents() noch nicht)

Bild war schon vorhanden
Das bislang war alles was wir machen mussten weil das Bild noch nicht gespeichert oder veraltet war die if Abfrage wurde also noch nicht beendet. Wenn das Bild doch schon vorhanden dann müssen wir einfach nur noch die Datei auslesen:


}else{
readfile('dynamic_cache/picker/'.$_GET['uid'].'.png');
}Dadurch wird dann halt der alte Picker nochmal geladen und an den Browser ausgegeben.

Der User kann nun den Picker mit
http://www.deine-domain.de/picker.php?uid=USERID
aufrufen.

So schaut es aus:
http://primeraclub.de/picker.php?uid=5&picker=1

Wenn ihr meine Url betrachtet könnt ihr sehen das bei mir auch noch die Variable &picker=1 ausgegeben wird das hat damit zu tun weil ich noch verschiedene Designs anbiete aber das muss ja nicht sein aber ist auch relativ einfach.

Mod_Rewrite
Einige Foren verbieten das einbinden von dynamischen Bildern hierfür habe ich auch schon einen Weg gefunden: Manipulation der Url mit mod_rewrite. Hierfür erfordert euer Server jedoch mod_rewrite. Erstellt einfach eine .htaccess mit folgendem Inhalt:



RewriteRule ^picker-([0-9]+).png$ picker.php?uid=$1
Ab sofort ist der Picker von User 1 dann z.B. als picker-1.png verfügbar. Sollte nachdem erstellen der .htaccess ein 500 Error erscheinen ist auf eurem Server kein Mod_Rewrite installiert. Ihr könnt euren Hoster jedoch bitten das zu aktivieren.

Viel Spaß mit dem Picker.

Der Picker darf gratis in Verbindung mit dem VMS1.x genutzt werden.

Gruß
Gremlin

Ps.: Wer mir was spenden will dafür kann es gerne tun!
Klammid: 184974
PrimusPortal Nick: Gremlin
PayPal: gremlincomputer [at] gmx [punkt] de
Ich freue mich auch über Backlinks von eurer Homepage hierzu könnt ihr diesen Code nutzen:


<a href="http://www.joke-factory.de" title="Witze" rel="follow">Witze</a>
Ps.: Die Grafik oben darf nicht verwendet werden.

Xenon
08.05.2008, 22:16
Ich muss sagen das du dir so viel mühe gemacht hast und es kostenlos hiereingestellt hast finde ich schon supi :thumb:


MFG
adi

Gremlin
08.05.2008, 23:56
Hab noch viele solcher Tutorials hab mir vorgenommen hier ab und zu mal welche zu veröffentlichen. Ist besser als wenn man direkt fertige Lösungen postet da hat ja keiner was von.

Hätte z.B. noch:
- Cache der Mediadaten
- Cache der Top 10 Liste

funktionieren alle fast genauso wie hier sogar noch etwas einfacher :thumb: weil hier ja noch der Statpicker an sich erstellt werden musste.

Wenn jemand noch eine Idee hat gerne PM mal schauen was sich machen lässt :smile:

Gruß
Gremlin

snowcat
15.05.2008, 17:46
Du verlangst in der Datenbankabfrage das $db_prefix, ohne es irgendwo angegeben zu haben.


$stat = mysql_fetch_assoc(mysql_query('SELECT k.kontostand,u.nickname FROM
'.$db_prefix.'_kontodaten AS k
LEFT JOIN '.$db_prefix.'_userdaten AS u ON u.uid = k.uid
WHERE k.uid='.(INT)$_GET['uid'].' LIMIT 1'));Ersetze also



$db_host = "localhost";
$db_user = "user";
$db_pass = "passwort";
$db_base = "datenbank";

mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_base);
durch



$db_host = "localhost";
$db_user = "user";
$db_pass = "passwort";
$db_base = "datenbank";
$db_prefix = "vms";

mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_base);


und alles passt dann soweit.

Gruß
Ralf

Gremlin
15.05.2008, 18:35
Korrekt, im Orignal hab ich direkt vms_ geschrieben deshalb ist es mir nicht aufgefallen :biggrin1:. Danke!

Gruß
Gremlin

Xenon
29.05.2008, 21:21
Ich ahbe es mal localhost weise mal zusammen gebaut und installiert und bei mir zeigt er immer an das er es nicht laden knna weil ein fehler vorhanden ist , lade ich die ganz alte aus dem dl beriehc hoch funkioniert es :-(


MFG
adi

Gremlin
31.05.2008, 16:42
Systemvorraussetzungen
- GDLib
- php >= 5
Beides vorhanden? :thumb:

Xenon
31.05.2008, 16:56
PhP : 5.2.x
GDLib ? was ist das ?

jpwfour
31.05.2008, 17:00
...
GDLib ? was ist das ?

eine erweiterung, die php bilder zeichnen lässt :yes:

testen:
http://de.php.net/manual/de/image.examples.php

wird auch für captcha bilder etc verwendet, oder zum erstellen von thumbnails (kleinere vorschaubilder)

Benutzer1699
31.05.2008, 17:01
Um die PHP-GD (http://de2.php.net/gd)-Funktionen zur Grafikmanipulation verwenden zu können wird die gdlib (http://www.libgd.org/Main_Page) benötigt.


edit: Mist, zu spät. Finde aber meine Antwort besser *lach

Xenon
31.05.2008, 17:05
Naja komischerweise kann es an der GDlib nicht liegen da de rlate statsspicker aus dem dl bereich funkioniert :knueppel:

Benutzer1699
31.05.2008, 17:09
adi, mal ein kleiner Tipp:
Jedes mal wenn du schreibst, dass es eine Fehlermeldung gibt, versuche diese gleich mal mitzuposten :thumb:

Xenon
31.05.2008, 17:31
Die Grafik "http://localhost/vms1/stats.php?uid=1" kann nicht angezeigt werden, weil sie Fehler enthält.
Bitte das wird angezeigt

Benutzer1699
31.05.2008, 17:48
Speicher die Grafik und schau sie dir mal in einem Editor an ;)

Xenon
31.05.2008, 17:55
Ja die ist im oder images vorhanden habe sogar die hier aus dem forum benutzt die von gremlin :knueppel:

Gremlin
31.05.2008, 17:56
Ersetze mal:


header('Content-Type: image/png');

durch


# header('Content-Type: image/png'); dann ruf nochmal auf ;)

Lösche vorher bitte noch die Grafik aus dem images Ordner damit der Cache nicht aktiv ist.

Benutzer1699
31.05.2008, 17:57
ich meinte die letzendlich generierte die, die "nicht angezeigt werden kann".

Xenon
31.05.2008, 18:02
UNd nach dem ich es geändert habe mit dem # kommt jetzt diese fehler meldung .

Warning: imagecreatefrompng(images/picker/1.png) [function.imagecreatefrompng (http://localhost/vms1/function.imagecreatefrompng)]: failed to open stream: No such file or directory in C:\localhostxampp\htdocs\vms1\stats.php on line 17

Warning: imagecolorallocate(): supplied argument is not a valid Image resource in C:\localhostxampp\htdocs\vms1\stats.php on line 18

Warning: imagettftext() expects parameter 1 to be resource, boolean given in C:\localhostxampp\htdocs\vms1\stats.php on line 19

Warning: imagettftext() expects parameter 1 to be resource, boolean given in C:\localhostxampp\htdocs\vms1\stats.php on line 20

Warning: imagettftext() expects parameter 1 to be resource, boolean given in C:\localhostxampp\htdocs\vms1\stats.php on line 22

Warning: imagepng(): supplied argument is not a valid Image resource in C:\localhostxampp\htdocs\vms1\stats.php on line 23

Warning: imagepng(): supplied argument is not a valid Image resource in C:\localhostxampp\htdocs\vms1\stats.php on line 24

Warning: imagedestroy(): supplied argument is not a valid Image resource in C:\localhostxampp\htdocs\vms1\stats.php on line 25

Benutzer1699
31.05.2008, 18:09
Warning: imagecreatefrompng(images/picker/1.png) [function.imagecreatefrompng]: failed to open stream: No such file or directory in C:\localhostxampp\htdocs\vms1\stats.php on line 17

du sagst es =) was macht man wenn eine Datei nicht eistiert oder der Pfad falsch ist :thumb:

Xenon
31.05.2008, 18:21
Also wie grad ztk sagte die datei befand sich im ordner images und nicht im ordner images /picker aber trozdem kommt dieser fehler
Die Grafik "http://localhost/vms1/stats.php?uid=1" kann nicht angezeigt werden, weil sie Fehler enthält.
habe das # auch grad entfernt

Benutzer1699
31.05.2008, 19:18
dann schau dir die Grafik mal als Quelltext an, und zwar die die generiert wird.


-> PHP Code wird ausgeführt
-> generiert Header | würde ich
-> generiert Bild | austauschen
-> Browser denkt: oh toll ein Bild
-> Browser bekommt aber nur PHP-Errors, kann diese nicht als gültiges Bild erkennen

Xenon
31.05.2008, 19:21
IcH habe nun die seite abgespeichert unter datei -> seite speichern unter und die datei habe ich umbenant in .txt und dann kam sowas raus :

<br />
<b>Warning</b>: imagettftext() [<a href='function.imagettftext'>function.imagettftext</a>]: Invalid font filename in <b>C:\localhostxampp\htdocs\vms1\stats.php</b> on line <b>19</b><br />
<br />
<b>Warning</b>: imagettftext() [<a href='function.imagettftext'>function.imagettftext</a>]: Invalid font filename in <b>C:\localhostxampp\htdocs\vms1\stats.php</b> on line <b>20</b><br />
<br />
<b>Warning</b>: imagettftext() [<a href='function.imagettftext'>function.imagettftext</a>]: Invalid font filename in <b>C:\localhostxampp\htdocs\vms1\stats.php</b> on line <b>22</b><br />


Danke dan ZTK der mir dabei geholfen hat

Wie kommt diese fehler meldung zurstanden ?

Benutzer1699
31.05.2008, 20:01
Dir fehlen die folgenden Dateien:
- css/trebucbd.ttf
- css/COMIC.TTF




ImageTTFText($picker,12,0,5,13,$schriftfarbe,"css/trebucbd.ttf",$stat['nickname']);
ImageTTFText($picker,8,0,5,26,$schriftfarbe,"css/COMIC.TTF","Guthaben: ".$stat['kontostand']);

Xenon
31.05.2008, 20:08
Wenn irh wollt dürft ihr mich jetzt :brick: der fehler lag an den .ttf dateien die ich vergessen haben :frusty::frusty::frusty::frusty: .

MFG
adi

PS : das mit roten ist nicht ernst gemeint . :knueppel:

SebbyPHM
01.06.2008, 15:45
Nur so nebenbei, bei Fehlermeldungen auf Englisch empfiehlt es sich oft "einfache Übersetzer" zu nutzen, diese reichen oft aus und man kann es sich noch zurecht denken. Einer davon wäre z. Bsp. http://uebersetzer.reverso.net .

a.LeXx
21.07.2008, 20:09
wäre es denn möglich diese piker.php mal für nicht-coder zu erstellen und diese hier zum DL anzubieten ? *freundlich fragt* *grins*

Xenon
21.07.2008, 21:29
wäre es denn möglich diese piker.php mal für nicht-coder zu erstellen und diese hier zum DL anzubieten ? *freundlich fragt* *grins*
Das ist ein tutorial = erklärung = anleitung :knueppel:
Das bedeutet du sollst alles alleine machen da es eine anleitung ist und so schwer ist es nicht ....

Und du / ihr / wir bekommen schon so alles durch die cummunity in die hände schon alles fertig gekriegt dann kann man einmal auch ma was selsbt machen =)

Gremlin
22.07.2008, 12:16
aber werst du mal auf seite 2 gegangen da habe ich den code zusammen gestellt
Hatte ;) habs entfernt aus dem von dir genannten Grund ;)

Xenon
22.07.2008, 12:49
Hatte ;) habs entfernt aus dem von dir genannten Grund ;)
Ok , danke dir , werde noch den post über mir editieren damit er passt da die seite 2 nicht mehr da ist :thumb:

cyberwulf
02.08.2008, 02:41
Da ich bei mir PHP4 läuft, habe ich es mal ein wenig mit Standardschriften umgeprutscht ;)


<?

if (!isset($_GET['uid']) OR (int)$_GET['uid'] <= 99 or (int)$_GET['uid'] > 999999){
die("Fehlerhafter Aufruf!");
}

if (!file_exists('dynamic_cache/picker/'.$_GET['uid'].'.png') || @filemtime('dynamic_cache/picker/'.$_GET['uid'].'.png') < time()-600){
require_once('lib/functions.lib.php');
db_connect();
ob_start();
$stat = mysql_fetch_assoc(mysql_query('SELECT k.kontostand,u.nickname FROM
'.$db_prefix.'_kontodaten AS k
LEFT JOIN '.$db_prefix.'_userdaten AS u ON u.uid = k.uid
WHERE k.uid='.(INT)$_GET['uid'].' LIMIT 1'));
if(!$stat['nickname'] AND !$stat['kontostand']){
die("Falsche Werte");
}

//Ausgabe wird Bild
header('Content-Type: image/png');
$picker = ImageCreateFromPng('images/picker/picker.png');
$schriftfarbe = ImageColorAllocate($picker,0,0,0);

//php 5
// ImageTTFText($picker,12,0,5,13,$schriftfarbe,"css/trebucbd.ttf",$stat['nickname']);
// ImageTTFText($picker,8,0,5,26,$schriftfarbe,"css/COMIC.TTF","Guthaben: ".$stat['kontostand']);
// ImageTTFText($picker,8,0,5,49,$schriftfarbe,"css/COMIC.TTF","www.Roadhorse.de");

//php 4
imagestring ($picker, 3, 2, 0, $stat['nickname'], $text_farbe);
imagestring ($picker, 2, 2, 16, $stat['kontostand']." Lose", $text_farbe);
imagestring ($picker, 2, 2, 32, "www. .de", $text_farbe);

ImagePng($picker);
ImageDestroy($picker);
//db schließen
db_close();
file_put_contents('dynamic_cache/picker/'.$_GET['uid'].'.png', ob_get_flush() );
}else{
//Ausgabe wird Bild
header('Content-Type: image/png');
readfile('dynamic_cache/picker/'.$_GET['uid'].'.png');
}

?>


Das Problem ist momentan noch das er keine Bilder ablegt ?!?

grüsse

cw

Sam2004
29.04.2011, 21:05
Hallo,

was muss man denn anstellen, dass man eine Rotation hinbekommt?

Ich würd gern abwechselnd gewisse Daten in gewisse zeitabständen anzeigen lassen.

Kann mir da jemand mit nem Ansatz oder Code helfen?

Danke schon mal.

LG