Тест скорости PHP для скорости подключения пользователя без эха на текущей странице

Я ищу возможность проверить скорость соединения пользователя. Предполагается, что он будет сохранен в виде файла 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, потому что вывод уже был.

Можно ли сделать что-то подобное в другом файле? У вас есть решение?

Заранее спасибо.


person Lukas Oppermann    schedule 15.10.2010    source источник
comment
Я думаю, что это невозможно с необработанным php.   -  person fabrik    schedule 15.10.2010
comment
что такое str_pad(), который добавляет 512 . используется для?   -  person Phill Pafford    schedule 15.10.2010
comment
Плохая идея; вы не можете сделать это точно, и даже если бы вы могли, вы не должны. Что вам нужно, так это мобильная версия вашего сайта с низкой пропускной способностью и удобным малым экраном, а также предоставляющая пользователям возможность использования этой мобильной версии.   -  person meagar    schedule 15.10.2010


Ответы (7)


У вас есть решение?

Мое решение - вообще не заморачиваться с тестом скорости. Вот почему:

Вы заявили, что цель теста — определить, какие файлы JS/CSS отправлять. Вы должны иметь в виду, что браузеры кэшируют эти файлы после первой загрузки (пока они не были изменены). Таким образом, вы отправляете 256 КБ тестовых данных, чтобы определить, следует ли отправлять, скажем, дополнительные 512 КБ?

Просто отправьте данные, и они будут кэшированы. Если у вас нет МБ JS/CSS (в этом случае вам нужен редизайн сайта, а не тест скорости), время загрузки будет выполнимым. Тесты скорости следует зарезервировать для таких вещей, как потоковое видео и тому подобное.

person webbiedave    schedule 15.10.2010
comment
Что ж, это действительно звучит правильно. Идея была более или менее предоставить эту версию, если в ней есть необходимость. Система, которую я создаю, является основой для многих будущих веб-страниц, и если будут большие фоны и тому подобное, было бы хорошо предоставить пользователю выбор версии с низкой пропускной способностью. Я думаю, что я сделаю это вручную, просто предоставив 2 кнопки. Спасибо за все ответы, если мне когда-нибудь понадобится это сделать, я знаю, где искать. - person Lukas Oppermann; 17.10.2010

Единственная идея, которую я могу придумать, это перенаправление.

  • Измеряйте скорость пользователей
  • Перенаправить на индекс

Хотя это не очень хорошее решение, ему нужно измерять скорость пользователей только один раз, поэтому я думаю, что это простительно.

person fabrik    schedule 15.10.2010

Как насчет использования javascript для определения времени загрузки страницы. Затем используйте javascript для установки файла cookie.

микровремя в 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/Latin может дать не лучший результат, т.к. символы могут сжиматься. Помимо высокого уровня сжатия gzip, некоторые модемы/линии (если не все) имеют базовое сжатие, которое способно обнаруживать повторяющиеся символы и сообщать другому концу, что следующие 500 являются повторением ' '. Я думаю, было бы лучше использовать двоичные данные, которые были сжаты
person Allen Hamilton    schedule 15.10.2010

Проблема здесь в том, что вы не можете решить это красиво и, вероятно, не на чистом PHP. Подход, который вы выбрали, заставит пользователя загрузить (512x512) = 262 144 байта бесполезных данных, что намного больше, чем у большинства полных страниц. Если пользователь использует медленное соединение, он может предположить, что ваш сайт не работает, прежде чем тест скорости закончится (при скорости 10 кБ/с потребуется полминуты, прежде чем на экране появится что-нибудь интересное!).

Вы можете сделать запрос AJAX для файла известного размера и времени, это занимает. Проблема здесь в том, что страница должна быть уже загружена, чтобы это работало, поэтому она будет работать только для последующих страниц.

Вы можете создать «загрузочную» страницу (как вы видите в GMail при доступе к ней из медленного соединения), которая предварительно загружает данные со ссылкой на версию с низкой пропускной способностью (или, возможно, перенаправление, если загрузка занимает слишком много времени).

Или вы можете сохранить время «начала» в файле cookie и сделать запрос AJAX, когда страница будет загружена, что даст вам фактическое время загрузки вашей страницы; если это, скажем, более 10 секунд, вы можете переключиться на версию с низкой пропускной способностью.

Однако ни один из них не даст вам скорости при первом доступе; и отправка большой пустой страницы вперед тоже не очень хорошее первое впечатление.

person Piskvor left the building    schedule 15.10.2010
comment
Ему нужна скорость до создания страницы, чтобы он мог выбрать, какой файл CSS включать. - person Alin Purcaru; 15.10.2010
comment
@Alin Purcaru: расскажите, как вы получаете скорость прежде чем что-либо скачивать? - person Piskvor left the building; 15.10.2010
comment
@fabrik: Точность в порядке - достаточно, чтобы выбирать между быстрой и медленной версией. Это всегда будет зависеть от других факторов — делает ли пользователь что-то еще с браузером, есть ли другие переводы и т. д. - person Piskvor left the building; 15.10.2010
comment
@Alin Purcaru: Можем ли мы сосредоточиться на вопросе, а не на троллинге? Спасибо. Я понимаю, что он пытается измерить скорость и выдать высокоскоростную/низкоскоростную версию; однако нет красивого способа решить эту проблему - мера AJAX будет полезна только для следующих страниц; для первой страницы, я боюсь, нет полезного способа одновременно измерить скорость и сделать что-то полезное на основе измерения. Не думайте, что использование AJAX автоматически означает, что это web2.0, AJAX — это волшебная пыль, заставляющая работать. Для него есть допустимые применения. - person Piskvor left the building; 15.10.2010

вы посещаете первую страницу (возможно, 100 КБ со всеми внешними файлами), сеанс сразу начинается с $_SESSION["start_time"] = time();

когда страница закончила загрузку (загрузка окна jQuery или что-то в этом роде:) вы снова отправляете запрос со временем, вы вычисляете скорость (jQueryRequestTime - $_SESSION["start_time"] / PageSize) и устанавливаете другую переменную сеанса, следующая ссылка, которую он щелкает, затем может включить пользовательские css/js, одобренные для этого

офк это не идеально :)

person rthrwht    schedule 16.10.2010

После того, как вы определили скорость пользователя, отправьте javascript в браузер, чтобы установить файл cookie, а затем выполните обновление или перенаправление в случаях, когда скорость ниже желаемой.

person Jack Shedd    schedule 15.10.2010

Единственное, о чем я могу думать, это подписаться на услугу, которая предлагает поиск IP-адреса в сети. Эти службы работают, создавая базу данных IP-адресов и каталогизируя их зарегистрированное предполагаемое использование. Они не всегда точны, но служат отправной точкой. Найдите IP-адрес пользователя по одному из них и посмотрите, что он возвращает.

Ip2Location.com предоставляет такую ​​базу данных, начиная с продукта DB13.

Конечно, если ваша цель — мобильная версия сайта, сниффинг агента пользователя — лучшее решение.

person Ryan Chouinard    schedule 15.10.2010