PHP Speed Test для скорости соединения пользователя без эха на текущей странице
Я ищу возможность проверить скорость подключения пользователя. Предполагается, что он будет сохранен как cookie, и файлы javascript, а также файлы css будут адаптированы, если скорость будет низкой.
Возможность тестирования скорости у меня на данный момент заключается в следующем
$kb = 512;
flush();
//
echo "<!-";
$time = explode(" ",microtime());
for($x=0;$x<$kb;$x++){
echo str_pad('', 512, '.');
flush();
}
$time_end = explode(" ",microtime());
echo "->";
$start = $time[0] + $time[1];
$finish = $time_end[0] + $time_end[1];
$deltat = $finish - $start;
return round($kb / $deltat, 3);
Несмотря на то, что это работает, мне не нравится, когда в код добавляется так много символов, и если я повторяю все это, я не могу сохранить результат в файле cookie, потому что уже есть вывод.
Можно ли сделать что-то подобное в другом файле? У вас есть какое-нибудь решение?
Заранее спасибо.
7 ответов
У вас есть какое-нибудь решение?
Мое решение - вообще не беспокоиться о тесте скорости. Вот почему:
Вы заявили, что причиной теста является определение того, какие файлы JS/CSS следует отправлять. Необходимо помнить, что браузеры будут кэшировать эти файлы после первой загрузки (если они не были изменены). Таким образом, по сути, вы отправляете 256 КБ тестовых данных, чтобы определить, следует ли отправлять, скажем, дополнительные 512 КБ?
Просто отправьте данные, и они будут кэшированы. Если у вас нет MB JS/CSS (в этом случае вам нужен редизайн сайта, а не тест скорости), время загрузки будет выполнимым. Скоростные тесты должны быть зарезервированы для таких вещей, как потоковое видео и тому подобное.
Единственная идея, что я могу придумать, это перенаправление.
- Измерьте скорость пользователей
- Перенаправить на индекс
Хотя это не очень хорошее решение, нужно измерять скорость пользователей только один раз, поэтому я думаю, что это простительно.
Проблема в том, что вы не можете решить эту проблему, и, возможно, не в чистом PHP. Выбранный вами подход заставит пользователя загрузить (512x512) = 262 144 байта бесполезных данных, что намного больше, чем у большинства полных страниц. Если у пользователя медленное соединение, он может предположить, что ваш сайт не работает до того, как тест скорости завершится (с 10 кБ / сек, потребуется всего полминуты, прежде чем на экране появится что-нибудь интересное!).
Вы можете сделать AJAX-запрос на файл известного размера и времени, сколько это займет. Проблема здесь в том, что страница должна быть уже загружена, чтобы она работала, поэтому она будет работать только для последующих страниц.
Вы можете создать "загрузочную" страницу (как вы видите в GMail при доступе к ней по медленному соединению), которая предварительно загружает данные со ссылкой на версию с низкой пропускной способностью (или, возможно, перенаправляет, если загрузка занимает слишком много времени).
Или вы можете сохранить время "запуска" в файле cookie и сделать запрос AJAX, когда страница будет загружена - это даст вам фактическое время загрузки вашей страницы; если это, скажем, более 10 секунд, вы можете перейти на версию с низкой пропускной способностью.
Однако ни один из них не даст вам скорость при первом доступе; и отправка большой пустой страницы заранее не очень хорошее первое впечатление.
Как насчет использования JavaScript для определения времени, которое требуется для загрузки страницы. Затем используйте JavaScript, чтобы установить cookie.
microtime в JavaScript http://phpjs.org/functions/microtime:472
Использование jQuery
<head>
<!-- include jquery & other html snipped -->
<script>
function microtime (get_as_float) {
// http://kevin.vanzonneveld.net
// + original by: Paulo Freitas
// * example 1: timeStamp = microtime(true);
// * results 1: timeStamp > 1000000000 && timeStamp < 2000000000
var now = new Date().getTime() / 1000;
var s = parseInt(now, 10);
return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
function setCookie(c_name, value, expiredays) {
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}
start = microtime(true);
$(window).load(function () {
// everything finished loading
end = microtime(true);
diff = end - start;
// save in a cookie for the next 30 days
setCookie('my_speed_test_cookie', diff, 30);
});
</script>
</head>
<body>
<p>some page to test how long it loads</p>
<img src="some_image_file.png">
</body>
Некоторые подводные камни: - Страница должна была бы начать загружаться сначала. JQuery должен быть загружен (или вы можете переделать приведенный выше код, чтобы избежать JQuery)
- Скорость тестирования на ASCII / латинских данных может не дать наилучшего результата, потому что символы могут быть сжаты. Помимо высокоуровневого сжатия gzip, некоторые модемы / линии (если не все) имеют базовое сжатие, которое способно обнаруживать повторяющиеся символы и сообщать другому концу, что следующие 500 повторяют ' '. Я думаю, что было бы лучше использовать двоичные данные, которые были сжаты
Вы посещаете первую страницу (возможно, 100 КБ со всеми внешними файлами), сеанс немедленно начинается с $_SESSION["start_time"] = time();
когда страница закончила загрузку (загрузка окна jQuery или что-то в этом роде:), вы снова отправляете запрос со временем, вычисляете скорость (jQueryRequestTime - $_SESSION["start_time"] / PageSize) и устанавливаете другую переменную сеанса, следующая ссылка, по которой он нажимает, может включить пользовательские CSS / JS, утвержденные для этого
ofc это не правильно:)
После того, как вы определили скорость пользователя, отправьте javascript в браузер, чтобы установить cookie, а затем выполните обновление или перенаправление в тех случаях, когда скорость ниже желаемой.
Единственное, о чем я могу думать, это подписаться на сервис, который предлагает поиск IP-адресов по скорости. Эти службы работают путем создания базы данных IP-адресов и каталогизации их зарегистрированного использования по назначению. Они не всегда точны, но они обеспечивают отправную точку. Посмотрите IP-адрес пользователя по одному из них и посмотрите, что он возвращает.
Ip2Location.com предоставляет такую базу данных, начиная с их продукта DB13.
Конечно, если ваша цель - мобильная версия сайта, то поиск агента является лучшим решением.