Blog Hoch
May 2018·1 tup leghDe'wI' ghItlhta'

HTTP Range Request PHP rap process

#downloadmanagement#php#range-request

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 bytes
  • Range: bytes=-500 file last 500 bytes
  • Range: bytes=50-99,200-249 bytes 50-99 'ej 200-249

combined je:

  • Range: bytes=0-99,500-1499,4000- bytes 0-99, 500-1499, 4000 file end Dung
  • Range: bytes=0-99,500-1499,-200 bytes 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.

chu'SPAM protection methods N° 3: timing everything againqanSPAM protection methods N° 1: Honeypot