2010-10-15 24 views
5

Tôi đang tìm kiếm khả năng kiểm tra tốc độ kết nối của người dùng. Nó được cho là được lưu dưới dạng tệp cookie và javascript cũng như tệp css sẽ được điều chỉnh nếu tốc độ chậm.Kiểm tra tốc độ PHP cho tốc độ kết nối của người dùng mà không có tiếng vọng trong trang hiện tại

Khả năng cho tốc độ thử nghiệm tôi có vào lúc ist sau

$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); 

Trong khi nó hoạt động, tôi không thích nó để đặt rất nhiều nhân vật vào mã của tôi cũng nếu Tôi xin nhắc lại tất cả điều này tôi không thể lưu kết quả trong một cookie vì đã có một đầu ra.

Có thể làm một cái gì đó như thế này trong một tập tin khác nhau wor một cái gì đó? Bạn có giải pháp nào không?

Xin cảm ơn trước.

+0

Tôi nghĩ rằng không thể với php thô. – fabrik

+0

str_pad() có gì thêm 512. được dùng cho? –

+0

Ý tưởng tồi; bạn không thể làm điều này một cách chính xác, và thậm chí nếu bạn có thể không nên. Những gì bạn muốn là một phiên bản di động của trang web của bạn mà là băng thông thấp và màn hình nhỏ thân thiện, và cung cấp cho người dùng tùy chọn * * sử dụng phiên bản di động đó. – meagar

Trả lời

6

Bạn có giải pháp nào không?

Giải pháp của tôi là không bận tâm đến việc kiểm tra tốc độ. Đây là lý do:

Bạn đã cho biết lý do của thử nghiệm là xác định tệp JS/CSS nào cần gửi. Bạn phải nhớ rằng các trình duyệt sẽ lưu các tệp này sau lần tải xuống đầu tiên (miễn là chúng chưa được sửa đổi). Vì vậy, trong thực tế, bạn đang gửi 256K dữ liệu thử nghiệm để xác định xem bạn có nên gửi, giả sử, 512K bổ sung không?

Chỉ cần gửi dữ liệu và dữ liệu sẽ được lưu vào bộ nhớ cache. Trừ khi bạn có MBs của JS/CSS (trong trường hợp đó bạn cần thiết kế lại trang web, không phải là kiểm tra tốc độ) thời gian tải xuống sẽ có thể thực hiện được. Kiểm tra tốc độ nên được dành riêng cho những thứ như video trực tuyến và các video tương tự.

+0

Vâng, điều đó thực sự đúng. Ý tưởng là nhiều hơn hoặc ít hơn để cung cấp phiên bản này nếu có nhu cầu cho nó. Hệ thống tôi đang xây dựng là cơ sở để nhiều trang web đến và nếu có nền tảng lớn và có thể tốt để cung cấp cho người dùng lựa chọn có phiên bản băng thông thấp. Tôi nghĩ rằng tôi sẽ làm điều đó bằng tay mặc dù, chỉ cần cung cấp 2 nút. Cảm ơn tất cả các câu trả lời mặc dù, nếu tôi bao giờ cần phải làm điều đó, tôi biết nơi để tìm. –

1

Vấn đề ở đây là bạn không thể thực sự giải quyết điều này một cách độc đáo và có lẽ không phải trong PHP thuần túy. Cách tiếp cận bạn đã thực hiện sẽ làm cho người dùng tải xuống (512x512) = 262 144 byte dữ liệu vô ích, lớn hơn nhiều so với hầu hết các trang hoàn chỉnh. Nếu người dùng kết nối chậm, họ có thể giả sử trang web của bạn bị hỏng trước khi kiểm tra tốc độ kết thúc (với 10 kB/giây, sẽ mất nửa phút trước khi bất kỳ điều gì thú vị xuất hiện trên màn hình!).

Bạn có thể yêu cầu AJAX cho một tệp có kích thước và thời gian đã biết trong bao lâu mất. Vấn đề ở đây là trang cần phải được tải để làm việc, vì vậy nó chỉ hoạt động cho các trang tiếp theo.

Bạn có thể tạo trang "tải" (như bạn thấy trên Gmail khi truy cập từ kết nối chậm) tải trước dữ liệu, với liên kết tới phiên bản băng thông thấp (hoặc có thể chuyển hướng nếu đang tải quá lâu).

Hoặc bạn có thể lưu thời gian "bắt đầu" trong cookie và thực hiện yêu cầu AJAX khi tải trang xong - điều đó sẽ cung cấp cho bạn thời gian tải thực tế của trang; nếu đó là, nói rằng, hơn 10 giây, bạn có thể muốn chuyển sang phiên bản băng thông thấp.

Tuy nhiên, không có điều nào trong số này sẽ giúp bạn đạt được tốc độ truy cập đầu tiên; và gửi một trang trống lớn lên phía trước cũng không phải là ấn tượng đầu tiên rất tốt.

+0

Và chính xác như thế nào? – fabrik

+0

Anh ấy cần tốc độ ** trước khi ** tạo trang để anh có thể chọn tệp CSS cần bao gồm. –

+0

@Alin Purcaru: làm thế nào để biết, làm thế nào để bạn có được tốc độ * trước khi * bạn tải về bất cứ điều gì? – Piskvor

3

Ý tưởng duy nhất tôi có thể đưa ra là chuyển hướng.

  • Measure của người sử dụng tốc độ
  • Redirect đến chỉ số

Trong khi điều này không phải là một giải pháp tốt đẹp nó chỉ cần đo của người sử dụng tốc độ chỉ một lần vì vậy tôi nghĩ rằng nó có thể tha thứ.

0

Sau khi bạn đã xác định tốc độ của người dùng, hãy gửi javascript đến trình duyệt để đặt cookie và sau đó thực hiện làm mới hoặc chuyển hướng trong trường hợp tốc độ dưới mức bạn muốn.

1

Cách sử dụng javascript để thời gian cần để tải trang. Sau đó sử dụng javascript để đặt cookie.

microtime trong javascript http://phpjs.org/functions/microtime:472

Sử dụng 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> 

Một số cạm bẫy: - Các trang sẽ cần phải bắt đầu tải đầu tiên. JQuery sẽ cần phải được tải (hoặc bạn có thể làm lại mã trên để tránh jQuery)

  • tốc độ thử nghiệm trên dữ liệu ASCII/Latin có thể không cho kết quả tốt nhất, vì các ký tự có thể bị nén. Bên cạnh việc nén gzip cấp cao, một số modem/dòng (nếu không phải tất cả) có nén cơ bản có thể phát hiện các ký tự lặp lại và cho biết đầu kia là 500 tiếp theo lặp lại ''. Tôi đoán tốt nhất nên sử dụng dữ liệu nhị phân đã được nén
0

Điều duy nhất tôi có thể nghĩ là đăng ký dịch vụ cung cấp tra cứu tốc độ mạng IP. Các dịch vụ này hoạt động bằng cách xây dựng cơ sở dữ liệu các địa chỉ IP và lập danh mục mục đích sử dụng đã đăng ký của chúng. Chúng không phải lúc nào cũng chính xác, nhưng chúng cung cấp một điểm khởi đầu. Tra cứu địa chỉ IP của người dùng dựa vào một trong những địa chỉ này và xem nó sẽ trả về cái gì.

Ip2Location.com cung cấp cơ sở dữ liệu như vậy, bắt đầu bằng sản phẩm DB13 của chúng.

Tất nhiên, nếu mục tiêu của bạn là phiên bản di động của trang web, thì tác nhân người dùng đánh hơi là giải pháp tốt hơn.

1

bạn truy cập trang đầu tiên (có thể là 100kB với tất cả các tệp bên ngoài), phiên được bắt đầu hoàn toàn với $ _SESSION ["start_time"] = time();

khi trang tải xong (tải cửa sổ jQuery hoặc smth :) u gửi yêu cầu lần nữa, u tính tốc độ (jQueryRequestTime - $ _SESSION ["start_time"]/PageSize) và đặt biến phiên khác liên kết mà anh nhấp vào sau đó có thể bao gồm tùy chỉnh css/js đã được phê duyệt cho rằng

ofc này không phải là perect :)

Các vấn đề liên quan