ref https://bugs.php.net/bug.php?id=39135 ,
i was thinking about how to implement HTTP Range requests/HTTP 206 Partial
Content in userland php,
and ofc it's possible to implement using fread()
loops, but it'd be easier
(and faster? presumably) to implement if fpassthru()
natively supported a
$max_bytes=null argument,
an example of where it would be useful:
<?php
$h=tmpfile();
fwrite($h,"123456789ABCDEF");
// this is NOT a proper http-range-parser!
$range = $_SERVER['HTTP_RANGE'] ?? "bytes=5-9";
$range=explode("-",explode("=",$range,2)[1],2);
$start = (int)$range[0];
$byte_count = (-$start) + ((int)$range[1]) + 1; // the range format is
weird.. "Range: bytes=5-5" means "seek to byte #5 and serve 1 byte", 5-6
means "seek to byte #5 and serve 2 bytes"~
fseek($h,$start,SEEK_SET);
http_response_code(206); // HTTP 206 Partial Content
//echo fread($h,$byte_count); // << this is not suitable for large files,
if 1GB bytes is requested, this will use 1GB ram...
fpassthru($h, $byte_count);
// should print 6789A
Le 30/10/2021 à 11:39, Hans Henrik Bergan a écrit :
ref https://bugs.php.net/bug.php?id=39135 ,
i was thinking about how to implement HTTP Range requests/HTTP 206 Partial
Content in userland php,
and ofc it's possible to implement usingfread()
loops, but it'd be easier
(and faster? presumably) to implement iffpassthru()
natively supported a
$max_bytes=null argument,an example of where it would be useful:
<?php
$h=tmpfile();
fwrite($h,"123456789ABCDEF");
// this is NOT a proper http-range-parser!
$range = $_SERVER['HTTP_RANGE'] ?? "bytes=5-9";
$range=explode("-",explode("=",$range,2)[1],2);
$start = (int)$range[0];
$byte_count = (-$start) + ((int)$range[1]) + 1; // the range format is
weird.. "Range: bytes=5-5" means "seek to byte #5 and serve 1 byte", 5-6
means "seek to byte #5 and serve 2 bytes"~
fseek($h,$start,SEEK_SET);
http_response_code(206); // HTTP 206 Partial Content
//echo fread($h,$byte_count); // << this is not suitable for large files,
if 1GB bytes is requested, this will use 1GB ram...
fpassthru($h, $byte_count);
// should print 6789A
Hello,
Can't you use fseek()
and stream_copy_to_stream()
to achieve what you're
trying to do without consuming memory ?
Regards,
--
Pierre