PDA

Bekijk Volledige Versie : Bandwidth stats / eigen cp



ChucKz
08/09/03, 19:29
Ik ben bezig met me eigen CP te maken voledig in php.
Nu wil ik elke dag via crontab een php script laten draaien die dus via de logfiles van apache de bandwidth per user berekend.

Nu vraag ik me af is dit wel de beste / makkenlijkste manier om dit te doen?

Ik wil dus 1x per dag de bandwidth berekenen en die in de client zijn mysql row updaten.

Alle reacties / tips zijn welkom.

EDIT:
iets meer info ;)

Ik maak dus per user geen aparte linux user aan maar alleen een nieuwe map in /var/www/
Dus via de path kan je zo de eerste dir eruit grappen zodat je de username van die persoon weet.
Met die username kan je vanuit de mysql database info halen.

PimEffting
09/09/03, 10:39
Ik denk dat PHP te traag is om alle logfiles door te spitten op bandbreedte verbruik...
Kijk eens bij oplossingen zoals webalizer. Zij zijn ook niet gemaakt in bash. Misschien dat je wat code van ze kunt 'lenen'.

Herbert
11/09/03, 21:02
Ik ben ook even bezig geweest om de webalizer.hist uit te lezen met PHP
Hieronder een script van mij wat nog niet goed werkt omdat er geen spatie achter de regels staat.
Als ik handmatig achter elke regel een spatie zet dan wertk het..
- hier het script -



<?
function maand($invoer) {
$invoer = str_replace("10", "", $invoer);
$invoer = str_replace("11", "", $invoer);
$invoer = str_replace("12", "", $invoer);
$invoer = str_replace("1", "", $invoer);
$invoer = str_replace("2", "", $invoer);
$invoer = str_replace("3", "", $invoer);
$invoer = str_replace("4", "", $invoer);
$invoer = str_replace("5", "", $invoer);
$invoer = str_replace("6", "Juni", $invoer);
$invoer = str_replace("7", "July", $invoer);
$invoer = str_replace("8", "Augustus", $invoer);
$invoer = str_replace("9", "September", $invoer);
return $invoer;
}
$handle = fopen ("webalizer.hist", "r");
$data = fread($handle, 1000000);
$getallen = "$data";
$getexplode = explode (" ", $getallen);

$aantalregels = "12";
for ($i = 0; $i <= $aantalregels; $i++) {
$aantalexplode = ($i*10);
$aantalexplode5 = ($i*10) + 5;
$maand = $getexplode[$aantalexplode];
echo maand($maand)."<br>";
echo $getexplode[$aantalexplode5]."<br>";
}

?>

Het script is nog niet af, ik zoek eerst een oplossing voor de spatie.
($i*10) + 5; hier leest hij het 5'de getal dat zijn de aantal bytes

Pinocchi
13/09/03, 10:52
Ben maar heel even bezig geweest hiermee, maar dit is wat daaruit kwam



<?php

$lines=file("Path-to-webalizer.hist/webalizer.hist");
foreach ($lines as $line_num => $line) {
$line = trim($line);
$waarden=explode(' ',$line);
echo "jaar: $waarden[1] maand: $waarden[0] Total: ".number_format($waarden[5]/1024, 0, ',', '.')." MB<br>";
}
?>


Geeft de hoeveelheid dataverkeer per MB aan via de webalizer.hist file.
Mocht je hierover nog vragen hebben dan hoor ik dat graag.

Herbert
13/09/03, 13:39
Origineel geplaatst door Pinocchi
Ben maar heel even bezig geweest hiermee, maar dit is wat daaruit kwam



<?php

$lines=file("Path-to-webalizer.hist/webalizer.hist");
foreach ($lines as $line_num => $line) {
$line = trim($line);
$waarden=explode(' ',$line);
echo "jaar: $waarden[1] maand: $waarden[0] Total: ".number_format($waarden[5]/1024, 0, ',', '.')." MB<br>";
}
?>


Geeft de hoeveelheid dataverkeer per MB aan via de webalizer.hist file.
Mocht je hierover nog vragen hebben dan hoor ik dat graag.
Pinocchi bedankt het werkt :)

TimmiT.nl
22/09/03, 16:29
kijk dit is exact wat ik zoek, bedankt!

Pinocchi
22/09/03, 17:07
graag gedaan jongens

WilcoOnline
22/09/03, 23:06
Alstublieft Mensen,

<?php

/* declaraties */
$domains_base = "/home/domains";
$history_file = "stats/webalizer.hist";

$hostname = "localhost";
$username = "user";
$dbName = "database";
$password = "password";

/* verbinding met de database */
MYSQL_CONNECT($hostname, $username, $password) OR DIE("Unable to connect to database");
@mysql_select_db( "$dbName" ) or die( "Unable to select database");

function find_history_file($site)
{
global $domains_base;
global $history_file;

$current_dir = basename($site);
if (($current_dir == ".") OR ($current_dir == ".."))
{
return;
}

// echo "$domains_base $site $history_file <br>\n";
$stats_file = "$site" . "/" . "$history_file";

parse_history_file($current_dir, $stats_file);
}

function parse_history_file($site, $stats_file)
{
if (is_file($stats_file))
{
$row = 1;
$handle = fopen ("$stats_file","r");

while ($data = fgetcsv ($handle, 1000, " "))
{
// $num = count ($data);
// print "<p> $num fields in line $row: <br>\n";

$mbytes = round(($data[5] / 1024), 2);

$date = "$data[1]" . "-" . "$data[0]" . "-00";
// echo $date;
$query = "DELETE FROM stats WHERE site=\"$site\" AND date=\"$date\"";
$result = MYSQL_QUERY($query);

$query = "INSERT INTO stats (site, date, kbytes) values(\"$site\", \"$date\", $data[5])";
$result = MYSQL_QUERY($query) or die ("Kan nieuwe records niet in de database stoppen");

$row++;
}
fclose ($handle);
}
}


function scan_domains()
{
global $domains_base;
global $history_file;

if ($handle = opendir('/home/domains/'))
{
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle)))
{
$directory = "$domains_base" . "/" . "$file";
if (is_dir($directory))
{
// echo "$file <br>\n";
find_history_file($directory);
}
}
closedir($handle);
}
}


function fetch_domains_list()
{
$query = "SELECT DISTINCT site FROM stats ORDER BY site";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met domeinnamen niet ophalen");
$number = @MYSQL_NUMROWS($result);

print "<form name=site action=\"sites_stats.php\" method=GET >";
print "<select name=site size=1 >";

if( $number == 0 )
{
// nothing to see here, move along
print "<option value=\"\">Leeg</option>";
}

$i = 0;
while ($i < $number)
{
$site = mysql_result($result,$i,"site");

print "<option value=\"$site\">$site</option>";
$i++;
}

print "</select>";
print "<input type=submit Value=Go >";
print "</form>";
}


function fetch_date_list()
{
$query = "SELECT DISTINCT date FROM stats ORDER BY date DESC";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met datums niet ophalen");
$number = @MYSQL_NUMROWS($result);

print "<form name=date action=\"sites_stats.php\" method=GET >";
print "<select name=date size=1 >";

if( $number == 0 )
{
// nothing to see here, move along
print "<option value=\"\">Leeg</option>";
}

$i = 0;
while ($i < $number)
{
$date = mysql_result($result,$i,"date");

print "<option value=\"$date\">$date</option>";
$i++;
}

print "</select>";
print "<input type=submit Value=Go >";
print "</form>";
}


function fetch_date_results($date)
{

$query = "SELECT SUM(kbytes) FROM stats WHERE date=\"$date\"";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met gegevens niet ophalen");
$number = @MYSQL_NUMROWS($result);
$totalkb = @MYSQL_FETCH_ROW($result);
$totalmb = round(($totalkb[0] / 1024), 2);
$totalgb = round(($totalkb[0] / 1048576), 2);

print "Totaal verkeer geserveerd door webserver: $totalmb MB / $totalgb GB";

$query = "SELECT * FROM stats WHERE date=\"$date\" ORDER BY kbytes DESC";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met gegevens niet ophalen");
$number = @MYSQL_NUMROWS($result);

print "<table border=1 >";
print "<tr><td>Site</td><td>Date</td><td>Traffic (MB)</td><td>Traffic (GB)</td></tr>";

if( $number == 0 )
{
// nothing to see here, move along
print "<tr><td>Leeg</td></tr>";
}

$i = 0;
while ($i < $number)
{
$site = mysql_result($result,$i,"site");
$kbytes = mysql_result($result,$i,"kbytes");

$mbytes = round(($kbytes / 1024), 2);
$gbytes = round(($kbytes / 1048576), 2);

print "<tr><td><a href=\"http://$site/\">$site</a> <a href=\"http://$site/stats/\">stats</a>
<a href=\"sites_stats.php?site=$site\">totals</a></td>
<td>$date</td><td>$mbytes MB</td><td>$gbytes GB</td></tr>";
$i++;
}
print "</table>";
}


function fetch_site_results($site)
{
$query = "SELECT SUM(kbytes) FROM stats WHERE site=\"$site\"";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met gegevens niet ophalen");
$number = @MYSQL_NUMROWS($result);
$totalkb = @MYSQL_FETCH_ROW($result);
$totalmb = round(($totalkb[0] / 1024), 2);
$totalgb = round(($totalkb[0] / 1048576), 2);

print "Totaal verkeer geserveerd door webserver: $totalmb MB / $totalgb GB";

$query = "SELECT * FROM stats WHERE site=\"$site\" ORDER BY date DESC";
$result = @MYSQL_QUERY($query) or die ("Kan de lijst met gegevens niet ophalen");
$number = @MYSQL_NUMROWS($result);

print "<table border=1 >";
print "<tr><td>Site</td><td>Date</td><td>Traffic (MB)</td><td>Traffic (GB)</td></tr>";

if( $number == 0 )
{
// nothing to see here, move along
print "<tr><td>Leeg</td></tr>";
}

$i = 0;
while ($i < $number)
{
$site = mysql_result($result,$i,"site");
$date = mysql_result($result,$i,"date");
$kbytes = mysql_result($result,$i,"kbytes");

$mbytes = round(($kbytes / 1024), 2);
$gbytes = round(($kbytes / 1048576), 2);

print "<tr><td>$site</td><td>$date</td><td>$mbytes MB</td><td>$gbytes GB</td></tr>";
$i++;
}
print "</table>";
}


if ($date == "")
{
if ($site == "")
{
scan_domains();
$today = date("Y-m-00");
header("Location: sites_stats.php?date=$today");
}
}

print "<html>";
print "<head><title>Traffic overzicht alle websites</title></head>";
print "<body>";

fetch_domains_list();
fetch_date_list();

if ($date)
{
fetch_date_results($date);
}

if ($site)
{
fetch_site_results($site);
}

MYSQL_CLOSE();

print "</body>";
print "</html>";

?>






En hier de db:
CREATE TABLE stats (
id int(11) NOT NULL auto_increment,
site varchar(50) NOT NULL default '',
date date NOT NULL default '0000-00-00',
kbytes int(32) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;

electric
23/09/03, 09:30
ik ben momenteel bezig met een scriptje die je direct alle uitvoer van de logfile kan parsen naar de DB. zodra deze af is laat ik het weten.
( je heb dus geen logfiles meer, maar ik maak dan direct ook een programmatje zodat je ook logfile's kan maken vanuit de DB. )

Herbert
23/09/03, 18:05
Origineel geplaatst door electric
ik ben momenteel bezig met een scriptje die je direct alle uitvoer van de logfile kan parsen naar de DB. zodra deze af is laat ik het weten.
( je heb dus geen logfiles meer, maar ik maak dan direct ook een programmatje zodat je ook logfile's kan maken vanuit de DB. )
Hoi Richard,
Ik heb zeer veel belangstelling voor dat script, was al een tijdje op zoek naar zoiets.
Herbert