#php #curl
#php #curl
Вопрос:
Я использовал хороший способ? Файлы большие, они могут достигать нескольких ГБ. Пожалуйста, дайте совет. $direct — это адрес к большому файлу. Скрипт поддерживает возобновление.
$contentLength = getParamFromHeaders('Content-Length', $fileHeaders);
$contentType = getParamFromHeaders('Content-Type', $fileHeaders);
$contentDisposition = getParamFromHeaders('Content-Disposition', $fileHeaders);
if (!$contentLength || !$contentType || !$contentDisposition) {
http_response_code(403);
echo 'error ' . __LINE__;
exit;
}
Отправка:
header('Cache-Control: public');
header('Content-Transfer-Encoding: binary');
header('Content-Type: ' . $contentType);
header('Content-Disposition: ' . $contentDisposition);
header('Accept-Ranges: bytes');
if (isset($_SERVER['HTTP_RANGE'])) {
preg_match('#^bytes=(d*)-(d*)$#is', @$_SERVER['HTTP_RANGE'], $range);
$rangeStart = (int) $range[1];
$rangeEnd = (int) $range[2];
if ($rangeEnd < $rangeStart) {
$rangeEnd = $contentLength - 1;
}
$newContentLength = $rangeEnd - $rangeStart 1;
header("HTTP/1.1 206 Partial Content");
header('Content-Range: bytes ' . $rangeStart . '-' . $rangeEnd . '/' . $contentLength);
header('Content-Length: ' . $newContentLength);
} else {
$rangeStart = 0;
$rangeEnd = $contentLength -1;
header('HTTP/1.1 200 OK');
header('Content-Length: ' . $contentLength);
}
Подключение к другому серверу:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $direct);
curl_setopt($ch, CURLOPT_RANGE, $rangeStart . '-'.$rangeEnd);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 8096);
curl_exec($ch);
curl_close($ch);
Отправка пользователю:
while (!empty($result)) {
echo $result;
}
Нужно ли мне вносить изменения в php.ini?
Комментарии:
1. Работает ли это у вас? В чем именно здесь проблема?
if (!empty($result))
— как это будет вести себя, если файл (или запрошенный фрагмент) состоит из всего0
?2. Да, это работает, но я ищу эффективные решения.
3. что неэффективно в этом решении? Нет абстрактной «эффективности». Что именно вы хотите улучшить?