"php speedtest.php" * * The US test files are 100 MB. Most of the international ones are 10 MB. * You'll want to run this on an actual server where you have a decent internet connection. * * Written 2/10/14 by James Nonnemaker - james(at)xtclc(dot)com * Compiled with snippits of code found on the net and on stackoverflow.com. * * Speed test servers are provided (unknowingly) by FDCservers @www.fdcservers.net and EDIS.at @www.edis.at * Be nice and buy something from them, maybe. * * Version 0.1 * New versions available at http://www.moo.net/code/ */ if ($_SERVER['REMOTE_ADDR']) { print "This program is meant to be run at the command line, not through your web browser."; exit; } $at = "@"; print "\n"; print "Simple PHP Unix Command Line Speed Test\n"; print "(C) 2014 James Nonnemaker - james" . $at . "xtclc.com\n"; //It's lame, but it should thwart the spammers. print "Test servers provided by FDCservers and EDIS.at\n\n"; ini_set('memory_limit', '500M'); $closest = "999999"; $count = "0"; $servers = array("lg.Chicago.fdcservers.net", "lg.chicago2.fdcservers.net", "lg.Denver.fdcservers.net", "lg.la.fdcservers.net", "lg.Miami.fdcservers.net", "lg.NewYork.fdcservers.net", "lg.Seattle.fdcservers.net", "lg.ams1.fdcservers.net", "lg.ams2.fdcservers.net", "lg.Frankfurt.fdcservers.net", "lg.Prague.fdcservers.net", "lg.Vienna.fdcservers.net", "lg.Zlin.fdcservers.net", "at.edis.at", "de.edis.at", "is.edis.at", "fr.edis.at", "us.edis.at", "pl.edis.at", "it.edis.at", "uk.edis.at", "ch.edis.at", "se.edis.at", "hk.edis.at", "es.edis.at", "cl.edis.at", "im.edis.at", "nl.edis.at", "ro.edis.at", "ru.edis.at"); $locations = array("Chicago, IL","Chicago, IL", "Denver, CO", "Los Angeles, CA", "Miami, FL","New York, NY", "Seattle, WA", "Amsterdam NL", "Amsterdam NL", "Frankfurt DE", "Prague CZ", "Vienna AT", "Zlin CH", "Vienna AT", "Frankfurt DE", "Hafnarfjordur IS", "Paris FR", "Chicago, IL", "Warsaw PL", "Milan IT", "London UK", "Zurich CH","Stockholm SE","New Territories HK","Madrid ES", "Vina del Mar CL", "Douglas IM", "Schiphol Rjik NL", "Bucharest RO", "Moscow RU"); print "Finding closest server "; foreach ($servers as&$thisserver) { $time = pingDomain($thisserver); if ($time < $closest) { $closest = $time; $bestserver = $thisserver; $serverid = $count; } $count++; print "."; } print "\n\nClosest server is $locations[$serverid] - $closest ms\nTesting download speed...\n\n"; $pieces = explode(".", $bestserver); if ($pieces[1] == "edis") { $downfile = "10MB.test"; } else { $downfile = "100MBtest.zip"; } @ob_flush(); @flush(); $fp = fopen('/dev/null', 'w'); $ch = curl_init(); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_URL, "http://$bestserver/$downfile"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress'); curl_setopt($ch, CURLOPT_NOPROGRESS, false); curl_exec($ch); fclose($fp); sleep(1); if(!curl_errno($ch)) { $info = curl_getinfo($ch); $size = $info['size_download']; $speed = $info['speed_download']; $time = $info['total_time']; print "\n"; $size = ($size/1024)/1024; $size = number_format($size, 2, '.', ''); $speed = ($speed/1024)/1024; $speed = number_format($speed, 2, '.', ''); $time = number_format($time, 4, '.', ''); print "\nDownloaded $size MB in $time seconds.\nDownload speed is: $speed MB/Sec\n"; } print "\n\n\n"; @ob_flush(); @flush(); curl_close ($ch); exit; function pingDomain($domain){ $starttime = microtime(true); $file = fsockopen ($domain, 80, $errno, $errstr, 10); $stoptime = microtime(true); $status = 0; if (!$file) $status = -1; else { fclose($file); $status = ($stoptime - $starttime) * 1000; $status = floor($status); } return $status; } function progress($download_size, $downloaded, $upload_size, $uploaded) { $downloaded = ($downloaded/1024)/1024; $download_size = ($download_size/1024)/1024; $downloaded = number_format($downloaded, 2, '.', ''); $download_size = number_format($download_size, 2, '.', ''); if (($download_size > 0) and ($downloaded < $download_size)) { show_status($downloaded, $download_size); } @ob_flush(); @flush(); } function show_status($done, $total, $size=30) { static $start_time; if ($done > $total) return; if ($done <= 0) return; if (empty($start_time)) { $start_time=time(); } $now = time(); $perc = (double)($done/$total); $bar = floor($perc*$size); $status_bar = "\r["; $status_bar .= str_repeat("=", $bar); if($bar<$size){ $status_bar .= ">"; $status_bar .= str_repeat(" ", $size-$bar); } else { $status_bar .= "="; } $disp = number_format($perc*100, 0); $status_bar .= "] $disp% $done MB/$total MB | "; $rate = ($now-$start_time)/$done; $left = $total - $done; $eta = round($rate * $left, 2); $elapsed = $now - $start_time; $status_bar .= "Remaining: ".number_format($eta)." sec. elapsed: ".number_format($elapsed)." sec."; print "$status_bar "; @flush(); if ($done == $total) { echo "\n"; } } ?>