Есть ли существующий способ проанализировать HTTP_RANGE
заголовок правильно в PHP? Мысль я спросил бы здесь перед изобретением велосипед.
Я в настоящее время использую
preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);
для парсинга заголовка, но это не покрывает все возможные значения заголовка, таким образом, я задаюсь вопросом, существует ли функция или библиотека, которая уже может сделать это?
Заранее спасибо.
Каждый раз нам нужно думать о реальной жизни и своих потребностях. В этом случае ключевым пунктом является то, какой из них должен быть другим.
В реальной жизни собака и босс могут не иметь друг друга. Но ваши потребности в программном обеспечении должны повлиять на эти отношения.
Например, если вы разрабатываете программное обеспечение для управления пациентами ветеринара, для ветеринара, который лечит бездомных собак, отношения Пациент (собака) - Guardian (босс) должны быть такими: Боссы должны иметь, по крайней мере, одну собаку, и собака может не иметь какого-либо босса (тогда boss id является внешним ключом этих отношений), что означает, что в вашем дизайне класс собаки должен держать коллекцию боссов. Почему, потому что любой экземпляр босса не может быть создан без собак. Мы также можем принять это решение с помощью логики данных. Давайте подумаем о том, когда вы пытаетесь сохранить свои занятия с собакой и боссом в базе данных. Если условие связи, как указано выше, при сохранении бобышки следует вставить запись соединения в таблицу соединений.
Если вы разрабатываете это программное обеспечение для ветеринара, который не лечит бездомных собак, то отношения Пациент - Родитель должны быть такими: Собака должна иметь хотя бы одного босса, а босс должен иметь хотя бы собаку, и нам нужно рассмотреть этот особый случай отношений. Это означает, что любой из этих экземпляров классов не может быть создан без других. Таким образом, мы должны определить эту специализацию в нашем дизайне OO. Это означает, что нам нужен класс, который представляет эту зависимость. Эта зависимость будет сохранена в таблице соединений.
- Если ваше программное обеспечение разработано для ветеринара, который лечит бездомных собак и этих собак, принятых боссами, ваш дизайн должен быть таким: Любая собака может не иметь босса (боссов), и любой босс может не иметь любого пса (псов) до усыновления. В этом случае наш проектировать OO должен заботиться об этом особом случае. Этот случай немного похож на первый. Так что мы можем добавить коллекцию любого класса в другой. Но любые потребности в программном обеспечении, подобные этому, повлияют на другие потребности. Как отчетность. Если ветеринар беспокоится о собаках, которых усыновил босс (и), рано или поздно он просит сообщить, какую собаку перенял кто. Как и в предложении, (собаки, принятые боссом (ами)) лучше, если собачий класс содержит коллекцию классов босса.
Надеюсь, что смогу дать правильные ответы на ваш вопрос.
-121--1451221- Используйте regex для тестирования перед отправкой 416
. Затем просто разберите на запятую ,
и дефис -
. Я также вижу, что вы использовали \d +
в вашем регексе, но это на самом деле не требуется. Если какой-либо из индексов диапазона опущен, то он просто означает «первый байт» или «последний байт». Вы должны покрыть это и в вашем регексе. Также см. заголовок диапазона в спецификации HTTP , как вы должны его обрабатывать.
Пример запуска:
if (isset($_SERVER['HTTP_RANGE'])) {
if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header('Content-Range: bytes */' . filelength); // Required in 416.
exit;
}
$ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));
foreach ($ranges as $range) {
$parts = explode('-', $range);
$start = $parts[0]; // If this is empty, this should be 0.
$end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1.
if ($start > $end) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header('Content-Range: bytes */' . filelength); // Required in 416.
exit;
}
// ...
}
}
Edit: $ start всегда должен быть меньше $ end
Взято из PEAR-пакета HTTP_Download:
function getRanges()
{
return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array();
}
Также неплохо было бы использовать this packages для таких вещей!