KOMPOOS.NL

estimate data - php

home » php » estimate-data.html

sitemap


voorbeeld van de estimate data procedure

estimated data

uitleg estimated data

Dat het plaatje pas na 400㎳ op het scherm "gezet" wordt, heeft niets met de snelheid van het PHP-script te maken. Om de snelheid van het laden maximaal te houden wordt met een stukje javascript de grafiek ingeladen nádat alle html is ingeladen (lazy-load).

Database's kunnen erg nuttig zijn om gegevens, over een lange(re) periode, snel, zichtbaar te maken. En zeker MySQL database's zijn verschrikkelijk "snel". Om bij dit voorbeeld te blijven: Het zichtbaar maken van de hoeveelheid bezoekers in een bepaalde periode, is echt een "werkje" voor een database. Tenminste als het aantal bezoekers niet meer dan een paar honderd per dag is. Als er echt héél veel bezoekers per seconde "binnenkomen" ga je al snel op zoek naar betere manieren om de data te vergaren.
De kompoos maakt gebruik van een concept wat gebruikt wordt bij een "high-traffic-site" (welke we onderhouden). De gegevens worden niet in een database gestopt maar in "platte" tekst-files. Buiten alle voordelen die deze manier van data-opslag al heeft, is er nog een "bonus". De "estimate-data-procedure"...

Het werkt als volgt.
Alle gewenste data (zoals ip, tijd, browser etc.) wordt met één (php)schrijfopdracht naar een tekst-file geschreven. De hoeveelheid bytes die geschreven worden zijn nagenoeg gelijk voor alle bezoekers. Als dus op - dag A - er 100㎅ in de file geschreven wordt, en op - dag B - 200㎅, dan kan je met vrij grote zekerheid zeggen dat er 2x meer bezoekers op dag B, dan op dag A, zijn geweest. De rest is makkelijk. Met een "glob-procedure" wordt de directory met de text-files "gelezen" en wordt de file-size bepaald. Laat de procedure (in dit geval) de laatste 180 dagen "lezen" en stop de hoeveelheid ㎅ per dag in een automatische grafiek-procedure. Het resultaat is op deze pagina te zien. De grafiek plaats je met een img op de pagina, bijvoorbeeld:


<img src="/php/estimate-data.php" width="700" height="200" alt="estimated data" />

en het php-script is een samenvoeging van de "glob-procedure" en de "php-grafiek-procedure" welke integraal hieronder is geplaatst (en die je in een nieuwe file: estimate-data.php moet plaatsen). Pas onderstaand script aan naar jouw eigen wens, of maak er een geheel andere procedure van.
Tot slot.
Bij sommige server-configuraties moet de font-naam (in de code) voorzien worden van een "path". In plaats van "helvetica.ttf" moet er dan "./helvetica.ttf" in de code komen te staan.

php script van de estimated data procedure


<?php
$absolute_pad_naar_root = "/home/het_absolute_pad_naar/tel/";
$test_slash = $absolute_pad_naar_root . "/";
function glob_files($path) {
    $files = array();
    if (is_dir($path)) {
        if ($handle = opendir($path)) {
            while (($name = readdir($handle)) !== false) {
               if (!preg_match("#^\.#", $name)) {if (is_dir($path."/".$name)) {
                    $files[$name] = glob_files($path."/".$name);
                } else {
                    $file_construct = $path."/".$name;
                    $datum_van_de_file = filemtime($file_construct);
                    $grootte=filesize($file_construct);
                    $huidige_tijd = time();
                    if (($huidige_tijd - $datum_van_de_file) <= 15552000) {
                       if(!preg_match('/(taal|_.txt|.db)/i',$name)){
                            $val = date("z", $datum_van_de_file);
                            $jaar_val = date("y", $datum_van_de_file);
                         if($val<100){
                             $val= "0$val";}
                          if($val<10){
                             $val = "0$val";}
                          if($grootte<10000000000){
                             $grootte= "0$grootte";}
                          if($grootte<1000000000){
                             $grootte= "0$grootte";}
                          if($grootte<100000000){
                             $grootte= "0$grootte";}
                          if($grootte<10000000){
                             $grootte= "0$grootte";}
                          if($grootte<1000000){
                             $grootte= "0$grootte";}
                          if($grootte<100000){
                             $grootte= "0$grootte";}
                          if($grootte<10000){
                             $grootte= "0$grootte";}
                          if($grootte<1000){
                             $grootte= "0$grootte";}
                          if($grootte<100){
                             $grootte= "0$grootte";}
                          if($grootte<10){
                             $grootte= "0$grootte";}
                          $files[] = $jaar_val.$val."$grootte|";
                       }
                     }
                  }
                }
            }
            closedir($handle);
        }
    }
    return $files;
}
function glob_html($list) {
    $html = "";
    foreach($list as $folder => $file) {
        if (is_array($list[$folder])) {
            $html.= glob_html($list[$folder]);
        } else {
            $html.= $file;
        }
    }
    return $html;
}
$raw_data = glob_html(glob_files($absolute_pad_naar_root));
$estimated_data = explode("|", $raw_data);
sort($estimated_data);
$lengte=count($estimated_data);
for($x=0;$x<$lengte;$x++){
   $estimated_data[$x]=substr($estimated_data[$x],5);
}
$first = array_shift($estimated_data);
$first = array_shift($estimated_data); // bedankt, wakkere vrienden: maar dit is bewust 2x...
array_pop($estimated_data);
$breedte = 700;
$hoogte = 200;
$rand_links = 60;
$rand_boven = 20;
$rand_rechts = 20;
$rand_onder = 40;
$gegevens = $estimated_data;
$grafiek = imagecreatetruecolor($breedte, $hoogte);
$tekst = imagecolorallocate($grafiek,120,120,120);
$tekst_achtergrond = imagecolorallocate($grafiek,255,240,240);
$grafiek_border = imagecolorallocate($grafiek, 140, 250, 50);
$grafiek_lijn = imagecolorallocate($grafiek,45,174,255);
$raster = imagecolorallocate($grafiek, 240,240,240);
$achtergrond_van_grafiek = imagecolorallocate($grafiek,252,255,252);
imagefill($grafiek, 0,0, $achtergrond_van_grafiek);
function dubbele_lijn($image, $x1, $y1, $x2, $y2, $kleur, $dikte = 2)
{
    if ($dikte == 1) {return imageline($image, $x1, $y1, $x2, $y2, $kleur);}
    $t = $dikte / 2 - 0.5;
    if ($x1 == $x2 || $y1 == $y2) {
    return imagefilledrectangle($image, round(min($x1, $x2) - $t), round(min($y1, $y2) - $t), round(max($x1, $x2) + $t), round(max($y1, $y2) + $t), $kleur);}
    $k = ($y2 - $y1) / ($x2 - $x1);
    $a = $t / sqrt(1 + pow($k, 2));
    $punten = array(
    round($x1 - (1+$k)*$a), round($y1 + (1-$k)*$a),
    round($x1 - (1-$k)*$a), round($y1 - (1+$k)*$a),
    round($x2 + (1+$k)*$a), round($y2 - (1-$k)*$a),
    round($x2 + (1-$k)*$a), round($y2 + (1+$k)*$a),);
    imagefilledpolygon($image, $punten, 4, $kleur);
return imagepolygon($image, $punten, 4, $kleur);}
$omlijsting =  array(
0,0,
0,$hoogte,
$breedte, $hoogte,
$breedte, 0,
$rand_links,0,
$rand_links, $rand_boven,
$breedte-$rand_rechts, $rand_boven,
$breedte-$rand_rechts, $hoogte-$rand_onder,
$rand_links, $hoogte-$rand_onder,
$rand_links, 0);
imagefilledpolygon($grafiek, $omlijsting, count($omlijsting)/2, $tekst_achtergrond);
$grafiek_breedte = $breedte-$rand_links-$rand_rechts;
$grafiek_hoogte = $hoogte-$rand_onder-$rand_boven;
$y_max = max($gegevens);
$y_min = min($gegevens);
$y_stapje = ceil( ($y_max - $y_min)/10);
$y_max = $y_min + 10 * $y_stapje;
for ($waarde = $y_min; $waarde <= $y_max; $waarde += $y_stapje){
    $y = $rand_boven + $grafiek_hoogte * ( 1 - ($waarde-$y_min) / ($y_max - $y_min) );
    imageline($grafiek, $rand_links, $y, $breedte-$rand_rechts, $y, $raster);
    $tekst_grootte = imagettfbbox(8, 0, "helvetica.ttf", $waarde);
    $tekst_breedte = $tekst_grootte[4]+$tekst_grootte[0];
    $tekst_hoogte =  0-$tekst_grootte[5];
imagettftext($grafiek, 8, 0, $rand_links-$tekst_breedte-8, $y + $tekst_hoogte/2, $tekst, "helvetica.ttf", round($waarde,1));}
$lijst_nummer = 0;
$previous_x = -1;
$previous_y = -1;
foreach ($gegevens AS $lijst => $waarde){
    $x = $rand_links + $grafiek_breedte * $lijst_nummer/(count($gegevens) - 1);
    $y = $rand_boven + $grafiek_hoogte * ( 1 - ($waarde-$y_min) / ($y_max - $y_min) );
    $tekst_grootte = imagettfbbox(8, 90, "helvetica.ttf", $lijst);
    $tekst_breedte = $tekst_grootte[4]+$tekst_grootte[0];
    $tekst_hoogte =  $tekst_grootte[1]-$tekst_grootte[3];
    imageline($grafiek, $x, $rand_boven, $x, $hoogte-$rand_onder, $raster);
    if ($previous_x != -1 && $previous_y != -1){
    dubbele_lijn($grafiek, $x, $y, $previous_x, $previous_y, $grafiek_lijn);}
    $previous_x = $x;
    $previous_y = $y;
    $lijst_nummer++;}
imagettftext($grafiek, 12, 0, 120, $hoogte - $rand_onder + $tekst_hoogte +3, $tekst, "helvetica.ttf", "unieke bezoekers afgelopen 180 dagen");
imagerectangle($grafiek, $rand_links, $rand_boven, $breedte-$rand_rechts, $hoogte-$rand_onder, $grafiek_border);
header("Content-type: image/png");
imagepng($grafiek);
imagedestroy($grafiek);
?>
Gebruik voor alle voorbeelden op de http://kompoos.nl een valide html5 pagina.