Zur Navigation

Übertragungsgeschwindigkeit vom User ermitteln

1 uwe

Hallo,
mit folgendem Code
<?php
$trackurl = $_SERVER['PHP_SELF'] ;
$trackUserAgent =strtolower($_SERVER['HTTP_USER_AGENT']);
if (stristr($trackUserAgent ,"archiver")) {$trackrobot="Alexa";}
if (stristr($trackUserAgent ,"exabot")) {$trackrobot="Exalead";}
if (stristr($trackUserAgent ,"fast")) {$trackrobot="Fast";}
if (stristr($trackUserAgent ,"firefly")) {$trackrobot="Fireball";}
if (stristr($trackUserAgent ,"googlebot")) {$trackrobot="Google";}
if (stristr($trackUserAgent ,"msnbot")) {$trackrobot="MSN";}
if (stristr($trackUserAgent ,"scooter")) {$trackrobot="AltaVista";}
if (stristr($trackUserAgent ,"yahoo-mmcrawler")) {$trackrobot="Yahoo";}
if (stristr($trackUserAgent ,"gigabot")) {$trackrobot="Gigabot";}
$trackdate = date('Y-m-d');
$tracktime = date('H:i:s');
$trackhost = $_SERVER['HTTP_HOST'];
$trackaddr = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
if ($trackrobot != "") {
$eingeloggt = "
trackrobot= $trackrobot
trackurl= $trackurl
trackdate= $trackdate
tracktime= $tracktime
trackhost= $trackhost
trackaddr= $trackaddr
\n";
$fp = fopen ("dateiname.txt","a+");
fwrite($fp,$eingeloggt);
fclose($fp);
} ?> 

kann man einiges über den User ermitteln.
Aber wie bekommt den raus, welche Übertragungsgeschwindigkeit der User hatte (MODEM, DSL384,DSL1000...)? (kbps)

Gruss
Uwe

16.12.2007 12:29

2 Jörg

Hallo Uwe,

mit folgendem Code kann man einiges über den User ermitteln.

Das ist nicht ganz korrekt: der Code loggt einige HTTP-Header-Daten einer definierten Menge von Suchmaschinen-Robots (wobei diese Daten grundsätzlich auch von Browsern geloggt werden können)

Aber wie bekommt den raus, welche Übertragungsgeschwindigkeit der User hatte (MODEM, DSL384,DSL1000...)? (kbps)

Hier ist ein Script aufgeführt, welches die Übertragungsgeschwindigkeit misst:

http://www.webmasterbiz.de/showthread.php?t=1264

Wie zuverlässig dieses arbeitet, kann ich aber nicht sagen.

16.12.2007 15:13

3 uwe

Hallo Jörg,
danke,
die Daten sollen in eine Datei geschrieben werden.

Die Textdatei soll
Datum|speed
als Aufbau haben.
<html> 

<head> 
<title>speed</title> 
<meta http-equiv="expires" content="0"> 
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="cache-control" content="no-cache"> 
</head> 

<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> 
<script type="text/javascript"> 
<!-- 
    time      = new Date(); 
    starttime = time.getTime(); 
// --> 
</script> 
<!-- 
<? include("speeddat.inc"); ?> 
// --> 
<script type="text/javascript"> 
<!-- 
    time          = new Date(); 
    endtime       = time.getTime(); 
    downloadtime     = (endtime - starttime)/1000; //Downloadzeit in Sekunden 
    kbytes_of_data = 100; //Groesse der Testdatei 
    linespeed     = kbytes_of_data/downloadtime; //KiB pro Sekunde 
//    if(linespeed > 30) { 
//    location.replace('schnell.html'); //Highspeed URL 
//    } else { 
//    location.replace('langsam.html'); //Lowspeed URL 
//    } 

datum = new Date();
AssignFile(f,'speed.txt');
if Fileexists(f,'speed.txt') then begin //f=Textfile
Append(f);
write(f,datum.toLocaleString());
write(f,"|");
writeln(f,linespeed);
Closefile(f);


// --> 
</script> 


</body> 
</html> 

Aber passiert noch nichts.

Gruss
Uwe

16.12.2007 20:09

4 Jörg

Du möchtest das Ergebnis in einer Textdatei auf dem Server speichern, also muss der Browser dieses dorthin senden, z.B. so:

linespeed     = kbytes_of_data/downloadtime; //KiB pro Sekunde
window.location.href = 'auswertung.php?linespeed='+linespeed;

In auswertung.php kannst du dann das Ergebnis auswerten und abspeichern.

16.12.2007 21:09

5 uwe

Hallo,
ok,
ich lese mit
<?php
 $wert = $_POST["linespeed"]; // Variablen einlesen

 $datum = date("d.m.Y",time()); // Aktuelles Datum ermitteln
 $text = "$datum |$wert \n"; // Textstring zusammensetzen

 $dateiname = "speed.inc"; // Name der Datei
 $fp = fOpen ($dateiname , "a+"); // Datei öffnen
 fWrite ($fp , $text); // Dateiinhalt in die Datei schreiben
 fClose ($fp); // Datei schließen
?>
ein.

Die Textdatei enthält aber nur das Datum und den Trenntrich.
(und alle Datensätze sind hintereinander und nicht untereinander)

Ich habe vor die "speed.php" in meine Haupt-Indexseite zu includen.

Ich fürchte aber das ich dann ganz aus der Hauptseite rausfliege.
Jetzt steht schon oben
http://www.xxx.de/xxxx/auswertung.php?linespeed=220.7505518763797

steht.

(Der Aufrufer so nicht merken das die Übertragsgeschwindigkeit berechnet wird)
Eigendltich darf sich die Hauptseite durch das Aufrufen der auswertung.php nicht ändern.

Gruss
Uwe

17.12.2007 00:32

7 uwe

Hallo,
danke für die Infos. Ich habe eine Lösung gefunden:

Gruss Uwe

<?php
// Bandbreitentest
$execute++;
if (!$StringTimes) {
$StringTimes = 8; // Multiplikator für 1kByte Zufallstring
// hier Wert 8 für 8 kByte Startwert zum Bandbreitentest
}

$StringTimes = $StringTimes * $execute;

// Erzeugen eines Zufall Strings, Basislänge = 1024 Byte, die in der Folge,
// je nach Multiplikator ($StringTimes) vervielfacht wird.
$RandStr = GetTestString(1024);
$RandString = $RandStr;
for($i=1;$i<$StringTimes; $i++){
$RandString .= $RandStr;
}

$TestSize = strlen($RandString) + 85;
// 85 ist jene Länge des JavaScript Codes der addiert werden muß
// beginnend nach
// var GO = new Date();
// +-- ab hier
// bis inklusive
// var STOP = new Date();
// bis hier --+
// unten weiter im Code

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");

print '
<HTML>
<HEAD>
<TITLE>Test der Bandbreite</TITLE>
<META http-equiv="expires" content="0">
</HEAD>
<BODY>


Test #'.$execute.' mit '.number_format($TestSize/1024, 0, ',', '.').
' kByte Daten '.number_format($interval, 2, ',', '.').
' Sekunden<br><br>
';

function GetTestString($size){
// Erzeugt Zufall String
srand ((double) microtime() * rand(100000,1000000) / rand(1,15));
for($i=0;$i<$size; $i++){
$string .= chr(rand(33,255));
}
return $string;
}

function CalculateBandwidth($interval){
global $TestSize;
global $execute;
if ($interval > 0) {
$unit_bs = "kBit/Sekunde";
$LS = (($TestSize / 1024 ) * 8 ) / $interval;

// wenn man die Anzeige in MBit haben will, dann vorne den comment weg
//if ($LS >= 1024) {
//$unit_bs = "MBit/Sekunde";
//$LS = $LS / 1024;
//}
$LS = number_format($LS, 0, ',', '.');
$speed = "<p>Übertragungsrate (Download): <b> $LS $unit_bs</b>";
}
return $speed;
}

$makeagain = 1;
if ($interval) {
if ($interval > 1 || $execute > 60) {
// Wenn auf LOCALHOST getestet wird muß der Loop begrenzt werden
// ansonsten dauert es ewig bis das Interval > 1 Sekunde erreicht wird
// bis 100 MBit und mehr inkrementiert sind dauert, das dauert ...
print CalculateBandwidth($interval);
$makeagain = 0;
}
}
if ($makeagain != 0) {
// Jetzt senden wir den Zufallstring an den Client und messen wie lange das dauert
print '
<form method="POST" action="'.$HTTP_SERVER_VARS["SCRIPT_NAME"].'">
<input type="hidden" name="interval" value="No Test">
<input type="hidden" name="execute" value="'.$execute.'">
<input type="hidden" name="mult" value="'.$StringTimes.'">
</form>
<script language="JavaScript">
var GO = new Date();
</script>
<!--
';
print $RandString; // Zufallstring wird reingebastelt
print '
-->
<script language="JavaScript">
var STOP = new Date();
StopAndGo = (STOP.getTime() - GO.getTime()) / 1000;
document.forms[0].elements[0].value=StopAndGo;
// alert (StopAndGo);
document.forms[0].submit();
</script>
';
// Die Zeit wurde ermittelt, dem Form übergeben und das Form gesendet
}
print '
<br><br>
<a href="'.$HTTP_SERVER_VARS["SCRIPT_NAME"].'?execute=1&mult='.$StringTimes.'" onClick="this.innerText="Bitte warten ..."">

Zur Ermittlung der Bandbreite, klick hier.
</a>
</BODY>
</HTML>
';
?>

18.12.2007 23:31

8 Tilman

Gibt es da auch eine Möglichkeit, dass ab einer bestimmten Übetragungsrate auf eine andere Seite umgeleitet wird?

25.12.2007 15:39

9 Jörg

Dazu könntest du CalculateBandwidth() entsprechend abwandeln, z.B. (ungetestet):

function CalculateBandwidth($interval){
global $TestSize;
global $execute;

if ($interval > 0) {
$unit_bs = "kBit/Sekunde";
$LS = (($TestSize / 1024 ) * 8 ) / $interval;

$LS = number_format($LS, 0, ',', '.');
$speed = "<p>Übertragungsrate (Download): <b> $LS $unit_bs</b>";
}
if ($LS > xy) {
window.location.href="http://deine-domain.tld/andere-seite.html";
} else {
return $speed;
}
}
(für xy den von dir gesetzten Grenzwert einsetzen)

25.12.2007 19:36

10 uwe

Hallo Jörg,
danke.

Gruss
Uwe

26.12.2007 07:08

Beitrag schreiben (als Gast)





[BBCode-Hilfe]