Im Übrigen kannst Du das chunked ja abstellen dadurch dass du dem Webserver in einem Responseheader Content-Length mitteilst wieviele bytes da kommen.
Ist Dir gar nich in den Sinn gekommen, dass es hier genau um das Gegenteil ging?
Das Gegenteil:
Du kannst das chunked erzwingen, in dem Du dem Server NICHT mitteilst, wie viele Bytes da kommen.
Also statt:
<?php
header( 'Content-Type: application/unknown' );
header( 'Content-Disposition: attachment; filename=' . $file );
header( 'Content-Length: ' . filesize( $file) );
readfile( $file );
?>
Ergebnis (Nur header):
---response begin---
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2017 13:59:01 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Disposition: attachment; filename=big_random
Content-Length: 1048576
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/unknown
---response end---
eben
<?php
header( 'Content-Type: application/unknown' );
header( 'Content-Disposition: attachment; filename=' . $file );
# header( 'Content-Length: ' . filesize( $file) );
readfile( $file );
?>
Ergebnis (Nur header):
---response begin---
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2017 13:57:30 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Disposition: attachment; filename=big_random
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/unknown
---response end---
Eines noch: Die Datenübertragungsrate bricht bei mir (wget -d --delete-after http://localhost/...) bei einer großen Datei (1GB) von 592 MB/s auf 482MB/s ein, wenn ich chunked verwende. Das will man also tatsächlich nicht immer. Bei den angesprochenen zip-Files ist davon abzuraten, also zuzuraten, die Filesize zu lesen und zu senden.
Spätestens bei solchen Größen würde dann die Möglichkeit einer Fortsetzung des Downloads interessant.