Comment calculer la vitesse de transfert d'une connexion ?
Par exemple en téléchargeant un fichier sur Internet, il est intéressant de connaitre la vitesse de chargement. La class DownloadSpeed regroupe 2 méthodes:
loadsimple(): charger un fichier avec file_get_contents() et mesurer le temps avec microtime(),
loadcurl(): charger un fichier avec l'extension cURL.
<?php
/**
* Calculer la vitesse de téléchargement
* @author Fobec.com 2011
*/
class DownloadSpeed {
private $time = 0.0;
private $bitrate = 0.0;
private $log = "";
/**
* Méthode1 avec file_get_contents
* @param string $url
*/
public function loadsimple($url) {
$t0 = microtime(true);
$file = @file_get_contents($url);
$t1 = microtime(true);
if ($file !== FALSE) {
$tdif = $t1 - $t0;
$size = strlen($file) / 1024;
$this->time = number_format($tdif, 3, ',', ' ');
$this->bitrate = number_format($size / $tdif, 2, ',', ' ');
} else {
echo 'error';
}
}
/**
* Méthode2 avec cURL
* @param string $url
*/
public function loadcurl($url) {
$this->log = "";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
$execute = curl_exec($curl);
$info = curl_getinfo($curl);
if ($info['http_code'] == 200) {
$this->time = number_format($info['total_time'], 3, ',', ' ');
$this->bitrate = number_format($info['speed_download'] / 1024, 2, ',', ' ');
foreach ($info as $key => $val) {
$this->log.=str_pad($key, 30) . $val . "\\n";
}
} else {
echo 'error';
}
}
/**
* Duree du telechargement
* @return string
*/
public function getTime() {
return $this->time;
}
/**
* Vitesse de connexion
* @return string
*/
public function getBitrate() {
return $this->bitrate;
}
/**
* Toutes les info avec cURL
* @return string
*/
public function getLog() {
return $this->log;
}
}
?>
Exemple d'utilisation de la class DownloadSpeed
Voici un exemple pour comparer les 2 méthodes celle du pauvre avec file_get_contents() et microtime() et celle de l'extension cURL.
<?php
/**
* Exemple
*/
$downloadSpeed = new DownloadSpeed();
$downloadSpeed->loadsimple("http://www.aupif.com/logiciel_super.zip");
echo 'loadsimple: methode avec file_get_contents';
echo '<br/>duree du chargement: ' . $downloadSpeed->getTime() . ' sec';
echo '<br/>vitesse de chargement: ' . $downloadSpeed->getBitrate() . ' ko/s';
$downloadSpeed->loadcurl("http://www.aupif.com/logiciel_super.zip");
echo "<br/><br/>loadcurl: methode avec l'extension curl";
echo '<br/>duree du chargement: ' . $downloadSpeed->getTime() . ' sec';
echo '<br/>vitesse dechargement: ' . $downloadSpeed->getBitrate() . ' ko/s';
echo '<br/>journal: <pre>' . $downloadSpeed->getLog() . '</pre>';
?>
Résultats de l'exemple:Les 2 méthodes donnent des résultats similaires. Il est clair que cURL fournit des détails très intéressants tels que la résolution DNS (namelookup_time), le temps de réponse du serveur (pretransfer_time) et la vitesse de chargement (speed_download).
loadsimple: methode avec file_get_contents
duree du chargement: 0,065 sec
vitesse dechargement: 9 986,42 ko/s
loadcurl: methode avec l'extension curl
duree du chargement: 0,064 sec
vitesse dechargement: 10 151,27 ko/s
journal:
url http://www.aupif.com/logiciel_super.zip
content_type application/zip
http_code 200
header_size 276
request_size 178
filetime -1
ssl_verify_result 0
redirect_count 0
total_time 0.063679
namelookup_time 0.004506
connect_time 0.005501
pretransfer_time 0.005557
size_upload 0
size_download 661937
speed_download 10394902
speed_upload 0
download_content_length 661937
upload_content_length 0
starttransfer_time 0.006849
redirect_time 0