Autor Zpráva
World
Profil
Zdravim, napadlo mě měření rychlosti připojení pouze pomocí php a chtěl bych se zeptat jestli by to tak fungovalo a nebo script tohoto typu bez javascriptu nemá šanci...

příklad:
stránka test.php
->aktuální čas
->odeslání hlavičky se souborem
->stažení souboru
->aktuální čas
->porovnání časů
->vypočítání rychlosti
joejoe
Profil *
ja merim rychlost takhle:
<?php
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // datum v minulosti
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // vždy upraven
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0


function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}

$short_suffix = array(
'0' => 'B',
'10' => 'KB',
'20' => 'MB',
'30' => 'GB',
'40' => 'TB',
'50' => 'PB',
'60' => 'EB'
);

function best_scale ($ref) {
global $short_suffix;

$i = (strlen((integer)$ref)-2); // pocet mist
$k = (integer)($i/3) *10;
$j = $i%3;

return round($ref/pow(2,$k),2-$j)." ".$short_suffix[$k];
}

$kb = 1024; // velikost bloku
$blockcount = array(10, 20, 50, 70, 100, 120, 130, 250, 250, 250, 250, 250, 250);
$blocksize = array();
$blockcnt = array();

foreach($blockcount as $c) {
array_push($blocksize, $c*$kb);
}

$char = 'a';
for ($i = 0; $i < sizeof($blockcount); $i++) {
$str = '';
for ($j = 0; $j < $kb; $j++) {
$str .= $char;
}
array_push($blockcnt, $str);
$char++;
}

$testtime = 5; # maximum test time

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title> Speed meter </title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<meta http-equiv="pragma" content="no-cache" />
</head>
<body>
<center>

<?php

echo "Sending <br/> ";

$tm2 = $tm1 = getmicrotime();
$can_run = true;
$i = 0;
$testcount = sizeof($blockcount);
$nkb = 0;

while (($i < $testcount) && $can_run) {

echo "<!-- ";
$tested_blocks = $blockcount[$i];
// budeme pridavat n pismen po pism_len velkych blocich
$block = $blockcnt[$i];
for ($j = 0; $j < $tested_blocks; $j++) {
echo $block;
}
$nkb += $blocksize[$i];

echo "--> " . best_scale($nkb);

flush();

$tm2 = getmicrotime();
$can_run = (($tm2-$tm1) < $testtime );
$i++;

}
$tm2 = getmicrotime();
$time = round($tm2-$tm1, 3);
echo "<br/> ";

echo " <p>";
echo "Sent ".best_scale($nkb)." from $_SERVER[SERVER_NAME] to $_SERVER[REMOTE_ADDR] in $time seconds<br/> ";
// to not divide accidentaly by zero we accept inacurrancy of 0.001s
$speed = $nkb/($time+0.001);
$speedkbps = 8*$speed;

echo "Approximate download bandwidth speed of your connection is: "
.best_scale($speed).'/s = '.strtolower(best_scale($speedkbps)). 'ps';
echo '<br/>'.date('j.n.Y. H:i:s')."</p> ";

?>
</center>
</body></html>
World
Profil
joejoe
hmm, nezdá se mi, že by to měřilo moc přesně, dokonce si myslím, že je to až moc přehnané s tou orientační rychlostí, nebo se pletu? kdyžtak to někdo také zkuste...
World
Profil
prosím, zkuste to někdo, jak přesně to měří..
Manq
Profil
World
Proč to nezkusíš sám?
nightfish
Profil
World
naměřil jsem 8412 kbps, což +- odpovídá tomu, co mám zaplacené od karnevalu (8 Mbit download)
World
Profil
Manq
jestli sis nevšiml, psal jsem že jsem to zkusil, ale že se mi to moc nezdá, tak ať to zkusí ještě někdo jiný...

nightfish
dobře, dík za ochotu
nightfish
Profil
World
nevím, jaké hodnoty jsi naměřil ty, nicméně možné problémy mohou vzniknout:
- při velkém zatížení (procesoru) serveru, ze kterého stahuješ - skript nestíhá generovat data
- při nedostatečné šířce dostupného přenosového pásma serveru, ze kterého stahuješ - data se tahají pomalu
- při testování na localhostu (kdy je množství dat poměrně malé, rychlost stahování velká) - chyby přesnosti měření při malých časových úsecích...
World
Profil
nightfish
už jsem si to upravil a už to měří celkem přesně...
dá se tento kód nějak upravit i na zjištění rychlosti odesílání dat (upload)?
nebo nevíte o nějakém scriptu? na netu toho moc není, a když je, tak to je spíše jen na download
Tres
Profil *
jo, ten upload by se mi taky hodil...
World
Profil
pomozte prosím..
World
Profil
prosím, nevíte někdo o něčem?
joejoe
Profil *
ty upravy aby to merilo presneji zajimaji urcite nejenom mne.

Ja to pouzivam na testovani propustnosti lokalni site, na LAN mi to ukazuje cca 60 MBit, na Wifi to zalezi na kvalite spojeni.
Zkusel jsem nastavovat shaping ('tc') a kdyz jsem nastavil 2MBit, tak to ukazalo presne 2MBit

Co se tyce mereni rychlosti uploadu, tak bych pravdepodobne bych zkusil neco jako vygenerovat javascriptem textarea s prislusnym poctem znaku a odeslat. Az budu mit chvilku casu tak to zkusim vyrobit..

jinak muzes zkusit i nejake verejne merice a porovnat si vysledek s tim kdyz si vystavis takovy skript na nejaky hosting..
http://www.speedtest.cz/
http://www.rychlost.cz/
http://www.dsl.cz/rychlost.php
http://speedmeter.webz.cz/
http://testrychlosti.selfnet.cz/
http://test.rychlosti.net/
World
Profil
joejoe
no nejdříve jsem to zkoušel na localhostu, ale jak už psal nightfish, tam jsou velké nepřesnosti, tak jsem to potom zkusil hodit na wz.cz, tam jelikož je server maximálně vytížený, tak to také měřilo velice nepřesně, potom jsem to zkusil hodit na jeden můj placený hosting a tam už to celkem ušlo... ještě jsem si o tom něco přečetl, a zjistil jsem že čím větší blok se bude testovat, tím více přesné to bude, ale zase se to nesmí přehánět, aby se na výsledek nečekalo bůhví jak dlouho, a tak jsem tam nastavil 20480, což mě připadá, že už to měří celkem dobře...potom jsem si tam ještě přidal js hlášku, která zobrazí: Testuji, prosím čekejte...
než se test nedokončí...

no a pro uživatele s pomalejším připojením jsem tam dal samozřejmě menší blok...

btw. ten nápad na zjištění uploadu je vcelku dobrý, ani by se nemusel plnit javascriptem, dal by se použít podobný kód jako na download, zkusim si s tím pohrát...
joejoe
Profil *
tak jsem pridal i to mereni uploadu, teda spis priplacal (-;

http://www.stud.fit.vutbr.cz/~xmlich02/speedtest.phps

Navic nevim jak donutit msie usporneji alokovat pamet. (veme si to pres 60 mb, ale hlavne dochazi casto k vypadkum stranky)
Presnost asi taky nebude nic moc.
World
Profil
joejoe
právě mím záměrem bylo to udělat jen v php, jelikož javascript si uživatelé vypínají...

kdybych javascript neměl řešit, tak jsem také nějaké příklady našel, ale to se mě právě nehodí.. zkusím to nějak pořešit v phpku

ps:kdyby jsi to nějak vykutil přede mnou, kdyžtak sem napiš výsledek, díkec
World
Profil
napadlo mě obdobné řešení co si vymyslel ty, ale pomocí php:
->vygenerování určitého počtu znaků v závislosti na nastavené maximální velikosti
->vnořit tento text do textarea
->vytvořit form, který by tento soubor odeslal do určité složky na server
->změření uběhlého času

jméno toho souboru by bylo třeba pořád stejné, aby se na serveru zbytečně nevytvářely tucty souborů

myslíte, že by to takto fungovalo? máte někdo nějaké vylepšení?

doufám, že se někdo ozve, dík předem
World
Profil
prosím, nezkoušeli jste někdo nějakou metodu na měření uploadu v php? budu rád za každou radu...
něco jsem zkoušel s vytvářením, přesouváním souboru, jenže stále je to nepřesné...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0