public function serve($path)
{
$filesize = filesize($path);
$fp = fopen($path, 'r');
if (!isset($_SERVER['HTTP_RANGE'])) {
header('HTTP/1.1 200 OK');
header('Content-Length: ' . $filesize);
header('Accept-Ranges: bytes');
fpassthru($fp);
} else {
$range = new RangeHeader($_SERVER['HTTP_RANGE'], $path);
if (!$range->isValid()) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header('Content-Range: ' . $range->getContentRangeHeader());
exit;
}
$length = $range->getLength();
header('HTTP/1.1 206 Partial Content');
header('Content-Length: ' . $length);
header('Content-Range: ' . $range->getContentRangeHeader());
$start = $range->getFirstBytePosition();
if ($start > 0) {
fseek($fp, $start, SEEK_SET);
}
$chunk_size = 4096;
while ($length) {
$read = $length > $chunk_size ? $chunk_size : $length;
$length -= $read;
echo fread($fp, $read);
}
}
fclose($fp);
}