Bandbreite während Seitenbesuch ermitteln / Speedtest

ZodiacXP

Erfahrenes Mitglied
Hi,

wie würdet ihr per PHP die Bandbreite des Besuchers ermitteln?

Prämisse:
  • nur PHP und (X)HTML erlaubt
  • sämtliche third party (JS, Flash, Cookies etc.) abgeschaltet

Gesehene Lösung:
  • 100-1000 Zeichen per ob_end_flush ausgeben
  • Zeit per microtime messen

Ist das wirklich eine glaubhafte annäherung an die Geschwindigkeit des Besuchers?
Wartet ob_end_flush() auf den Browser des Benutzers?
Wird das nicht hinfällig sobald der Server seine Daten komprimiert verschickt?

---

Warum? (für die die es interessiert - soll BITTE NICHT teil der diskussion werden)
CSS3 bietet einige Möglichkeiten unterschiedliche Bildgrößen / -qualitäten zu laden. Man erkennt was das Endgerät ist und kann entsprechend handeln.
Nun kann jedoch auch jemand mit langsamer Verbindung (per Handy, Einwahlknoten etc.) an einem PC sitzen und man lädt riesige Dateien in hoher Qualität durch die Annahme er säße an einem vollwertigen Arbeitsplatz.
 
Nein, tut mir leid. Das hat recht wenig mit dem hier angedachten Speedtest zu tun.

Ziel: Bilder standardmäßig in niedrigster Quali rausschicken und während dessen den Speed testen. Beim aufruf einer anderen Seite liegt eine Statistik vom Benutzer vor auf dessen Grundlage man sich für höhere Qualis entscheiden kann.
 
Also nur mit PHP geht das definitiv NICHT !
Warum ? PHP läuft nur auf dem Server ... und ein solcher ist in der Regel mit einem sehr hohen Upstream-Speed angebunden *meistens 100MBit/s sync fullduplex*. Außerdem kann das PHP-Script Werte nur bis zum Ende seiner Ausführung auswerten ... da aber in der Regel ein Script auf dem Server erst komplett ausgeführt wird bevor überhaupt damit begonnen wird die Header-Informationen *Encoding , Content-Type / -Length* zu generieren ist das Script also schon "fertig" wenn das erste Byte des Results übertragen wird.

Ich hol mal weiter aus ...

TCP schreibt vor das jedes gesendete Paket von der Gegenstelle bestätigt werden muss. Passiert dies nicht , verspätet oder mit einem Error-Code wird das entsprechende Paket noch mal gesendet.
Für diese Reply-Pakete braucht der User natürlich auf seiner Seite auch Upstream-Bandbreite ...
Daraus folgt : die reale Geschwindigkeit des Downstreams wird durch die Bandbreite des Upstreams bestimmt *nur TCP !*. Hättest du jetzt also nur einen sehr geringen Upload wie 64kBit/s könntest du auch nur so viel Herunterladen wie damit an Paketen bestätigt werden können ... selbst wenn du Downstream 32MBit/s hättest ...
Leider verstehen das viele User nicht und kennen sich do gut auch nicht mit TCP/IP aus als das sie es begreifen würden.
Da nun ein TCP-Paket eine Mindestgröße von ich glaube 48 Bytes hat kannst du dir ausrechnen wie viele Pakete du bei nem Upstream von 64kBit/s senden könntest um damit Downstream-Pakete mit einer Maximalgröße von 1500 Bytes zu bestätigen. Daraus errechnet sich der effektive TCP-Downstream.

Das alles kannst du mit PHP aber nicht bestimmen ... und auch mit Perl / CGI dürfte so etwas Low-Level mäßig sehr schwerden. Der Server kann halt nur mit seiner Anbindung *100MBit/s* arbeiten und rechnen. Willst du die reale Geschwindigkeit des Clients ermitteln MUSST du Client-Sprachen wie eben JavaScript/AJAX , Flash , Java oder Andere verwenden ...
Nur mit Server-Sprachen ist das absolut UNMÖGLICH !

*btw : ja ... wenn du ein eigenes Server-Programm laufen lässt was die Antworten eines selbstgeschriebenen Clients auswertet ... das ist aber jenseits von HTTP oder gar PHP ...*
 
.. da aber in der Regel ein Script auf dem Server erst komplett ausgeführt wird bevor überhaupt damit begonnen wird die Header-Informationen *Encoding , Content-Type / -Length* zu generieren ist das Script also schon "fertig" wenn das erste Byte des Results übertragen wird.
...

PHP:
echo 'Hallo Spikee';
session_start();

Erzeugt folgenden Fehler:
Cannot modify header information - headers already sent

Das widerspricht sich irgendwie mit deiner Aussage?


Die Geschwindigkeit mit php zu messen wird echt nicht einfach, leichter wäre da doch den CSS Media Typen zu verwenden oder zu schauen wie schnell die Anfragen vom Clienten kommen.
 
Ja .. is mir schon klar das es da einen Konflikt mit den Headern gibt ... weis ich ja selbst ...
WARUM das so ist weis ich leider auch nicht so genau ... aber so ungefähr läuft das schon ab.
 
Ich hätte eine Idee, weiß aber nicht genau, ob es sich umsetzen lässt. Hier eine Erörterung:

Man sendet zwei Bilder mit 1KB Größe. Man misst die Zeit von Anfang des ersten bis Anfang des zweiten Bilds. Dies alles macht man mit <img>-Tag und dem Ziel zu einem PHP-Script, welches das Bild ausliefert und die Zeiten misst (Session wird bentötigt).

Nun hat man das Problem, das der Browser evtl. versuchen wird beide simultan herunter zu laden. Könnte man mit dem Header HTTP/1.0 lösen, der zu mindest schon mal Kompression deaktiviert. Außerdem könnte man versuchen, mit den Keep-Alive-Parametern herumzuspielen. Man müsste also genau das Gegenteil von Performance-Optimierung vornehmen, wie es hier beschrieben ist: http://www.howtoforge.com/configuring_apache_for_maximum_performance

Ich weiß nicht, ob und wie sich das alles mit PHP-Only umsetzen lässt, und ohne, das man Änderungen an der Webserver-Config vornehmen braucht. Aber vielleicht bringt dich das auf Ideen :-)
 
Zurück