HTTP Range Request PHP rap process
reH file Hoch server vo' load neH pagh - certain excerpt (Range) neH. start byte 'ej end byte define, range Dung data Hoch return. partial downloads (download resume pagh download management PHP via develop) pagh video streaming (video Hoch beginning vo' load neH pagh - relevant part neH next play). Range request chenmoH vaj 'oH.
1. Request
request header add:
Range: bytes=STARTBYTE-ENDBYTE
server Sov: nuq section deliver. file direct access vaj neH (server download manage 'ej file process). PHP first pass vaj own script ghItlh poQ.
2. Server - basics / range query
wa'DIch: nuq range return find. several ways 'ach simplest: regex via range filter.
if (isset($_SERVER['HTTP_RANGE'])) {
$range = preg_match('/^bytes=((\d*-\d*,? ?)+)$/', $_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : [0, filesize("video.mp4")];
}
$range[0] first byte (return poQ). $range[1] last byte. Range header request Daq set pagh vaj whole file return - byte 0 vo' ghoS, file size bytes (filesize()) Daq Qaw'. file read: start byte 'ej end byte Dung.
$fp = fopen('video.mp4', 'r');
fseek($fp, $range[0]);
echo fgets($fp, $range[1] - $range[0]);
file "fp" variable Daq poSmoH. fseek cursor first byte position Daq set, fgets number of bytes read return. qatlh: fgets second parameter end byte jIH pagh - number of bytes read (= end byte minus start byte). request header format rap send laH:
Range: bytes=Startbyte-Endbyte
3. Server - extended
specification tools.ietf.org more ways describe. corresponding part:
The first 500 bytes:
Range: bytes=0-499
The second 500 bytes:
Range: bytes=500-999
All bytes except for the first 500 until the end of document:
Range: bytes=500-
The last 500 bytes of the document:
Range: bytes=-500
Two separate ranges:
Range: bytes=50-99,200-249
The first 100 bytes, 1000 bytes starting from the byte number 500,
and the remainder of the document starting from byte number 4000:
Range: bytes=0-99,500-1499,4000-
The first 100 bytes, 1000 bytes starting from the byte number 500,
and the last 200 bytes of the document:
Range: bytes=0-99,500-1499,-200
RFC compliant formats support poQ:
Range: bytes=500-byte 500 vo' file end Dung Hoch bytesRange: bytes=-500file last 500 bytesRange: bytes=50-99,200-249bytes 50-99 'ej 200-249
combined je:
Range: bytes=0-99,500-1499,4000-bytes 0-99, 500-1499, 4000 file end DungRange: bytes=0-99,500-1499,-200bytes 0-99, 500-1499 'ej file last 200 bytes
foreach loop simplest.
$fp = fopen('video.mp4', 'r');
$filesize = filesize("video.mp4");
foreach (split(substr($_SERVER['HTTP_RANGE'], 0, 6), ',') as $range) {
preg_match_all("/(\d*)-(\d*)/", $range, $parts);
if ($parts[2][0] == "") $parts[2][0] = $filesize;
if ($parts[1][0] == "") {
$parts[1][0] = $filesize - $parts[2][0];
$parts[2][0] = $filesize;
}
fseek($fp, $parts[1][0]);
echo fgets($fp, $parts[2][0] - $parts[1][0]);
}
file read byte $parts[1][0] vo' length $parts[2][0] - $parts[1][0] bytes.
4. notes
PHP file Daq file header (MIME type) set poQ laH (browser format Sov). .mp4 file:
header("Content-Type: video/mp4");
header("Content-Length: " . filesize("video.mp4"));
MIME types Hoch selfHTML page Daq.