Löffel: HEAD-Alternative

Beitrag lesen

Sofern kein Output-Buffering verwendet wird, schickt PHP meines Wissens alle Ausgaben sofort ab (darum kommt es ja auch zur berühmten Fehlermeldung der header()-Funktion).

Und da das Skript mehrere sleeps beinhalten kann, um nicht zu viele Bytes pro Sekunde zu verschicken, kann es ziemlich lange dauern, bis das Skript fertig ist.

Ich erkenne darin keinerlei Sinnhaftigkeit (wer zur Hölle verlangsamt seine Scripts absichtlich?!)...

Naja, stell dir vor, du bietest große Dateien zum Download an und musst den Speed drosseln, damit du deine Warteschlange genau kontrollieren kannst ;) Wie auch immer, Anwenungsbereiche gibt es immer und ich bin solchen Skripts schon öfter begegnet, wehalb ich das in meinem Programm beachten muss oder eher sollte ;)

Ich habe es gerade mal versucht. Habe ein PHP-Skript genommen, das den speed auf 500KB/s begrenzt und mir ein 6 MB File liefert.
Mein Downloader ist in Java geschrieben.
Schicke ich ein GET-Request, bekomme ich sofort den InputStream und kann schon die ersten Zeilen und somit die Header auslesen. Es wird also mittels flush() im Script erfolgreich der Inhalt an den Client übertragen.
Änder ich das GET in ein HEAD um, dann bekomme ich den InputStream nicht sofort, sondern erst etwa 12 Sekunden später. Da 500 KB * 12 Sek ungefähr 6 MB ist, liegt die Vermutung nahe, dass bei dem Head-Request eben nicht gleich der Content gesendet wird (ist ja der Sinn von HEAD) und damit erst das Skript abgearbeitet wird.

Ich habe auch testweise mal einen anderen DL-Manager versucht (Multiget, C++). Dieser schickt ebenfalls zunächst ein HEAD-Request. Wenn ein Timeout von 30 Sekunden erreicht ist, dann kennzeichnet er den DL als failed.

Ich habe jetzt ebenfalls erstmal ein ReadTimeout eingebaut.
Wenn allerdings noch jemand eine Idee hat, kann er sich gerne melden :)