Отладка исходящих НТТР запросов/как работает НТТР враппер?

Фанат

oncle terrible
Команда форума
Задался тут вопросом, как реализован НТТР враппер.
В частности, использует ли он заголовок Range: если читать файл не целиком.
Но никак не могу разобраться.
В сорцах сам черт ногу сломит.
Отладочные прокси показывают один запрос, но при этом если читать малую часть файла, то память на весь не расходуется.
При этом фиддлер показывает размер скачанных данных равный размеру файла, а чарльз вообще какую-то фигню - все время 50 килобайт, не важно - больше ты запросил, или меньше.

В общем, как говорили в фидошечке - субж
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Задался тут вопросом, как реализован НТТР враппер.
В частности, использует ли он заголовок Range: если читать файл не целиком.
Для поддержки диапазонов нужно же предварительно запрос сделать, чтоб заголовки вычитать, вряд ли враппер делает HEAD для этого до обычного чтения, не?
 

Фанат

oncle terrible
Команда форума
Логично. Ну то есть читает кусками вряд ли.
Но тогда я не понимаю, куда он девает скачанное. Память внутри самого пхп не расходуется. Если, скажем, делать fread блоками по 1К десятиметровый файл, то расход памяти остается на одном уровне, 800к в пике (хотя конечно само по себе это овердофига). То есть он читает из какого-то внешнего потока, который и буферизует файл?

С другой стороны, fopen же по идее не должен ничего читать. Ну по идее же? Тогда получается что посылает именно HEAD
вот это, блин я и хотел посмотреть проксей, но нифига не увидел.
Блин ставить этот, как его - пакетный инспектор?
 

ksnk

прохожий
Это почему это fopen не должен ничего читать ? Обычный fopen проверяет наличие файла, доступность файла на чтение-запись, определяет размер файла, t.e. читает данные из файловой системы еще до реального чтения данных. Чем враппер хуже?

Еще такой забавный глюк встретил, когда читал файлы из тар-гнузипа. Оттуда fopen читает всегда по 8к, независимо от запрошенного размера, может и тут какие-то накладки на загнузипленный вывод ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Логично. Ну то есть читает кусками вряд ли.
Но тогда я не понимаю, куда он девает скачанное. Память внутри самого пхп не расходуется
Ну он потоковый, да, в буфер выкачивает сегментами.
Ваще хз, может он типа и делает вместо fstat() HEAD запрос для сетевого враппера.

Блин ставить этот, как его - пакетный инспектор?
Wireshark, не?
 
Эм, из сокета читает вестимо. В сокет данные попадают из буфера операционки. В буфер - из сети. Ну почему http чтение должно отличаться от чтения любого другого tcp соединения. Там вся разница в том, что при открытии делается http запрос и вычитываются заголовки. https://github.com/php/php-src/blob/605ac4649c1e8cf845dbe2bff575ad0b0469b5fe/ext/standard/http_fopen_wrapper.c
 

флоппик

promotor fidei
Команда форума
Партнер клуба
ам вся разница в том, что при открытии делается http запрос и вычитываются заголовки.
Да, но чтоб задействовать Range, нужно несколько запросов, включая проверку на то, что вообще поддерживается ли Range сервером вообще.
 
Да, но чтоб задействовать Range, нужно несколько запросов, включая проверку на то, что вообще поддерживается ли Range сервером вообще.
А причем тут range? Ты сделал fopen - случился коннект, GET, получение ответа заголовков и мож там первый кусок тела в буфер. Дальше просто соединение держится открытым пока ты кусами читаешь поток.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А причем тут range? Ты сделал fopen - случился коннект, GET, получение ответа заголовков и мож там первый кусок тела в буфер. Дальше просто соединение держится открытым пока ты кусами читаешь поток.
Range здесь в изначальном вопросе.
 
Ну скорее его интересовал не range, а как врапер устроен.
Нету range.
Был бы range - можно было бы сик делать назад. Сик вперед делается просто чтением нужного числа байт, это на пхп в доке написано.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Задался тут вопросом, как реализован НТТР враппер.
В частности, использует ли он заголовок Range: если читать файл не целиком.
нет, иначе это был бы отдельный запрос, так просто нельзя делать - запрос может быть неидемпотентным, и преждевременный HEAD может убить ресурс

Отладочные прокси показывают один запрос, но при этом если читать малую часть файла, то память на весь не расходуется.
вот что прокси показывают, то и есть, можно еще проще - очисти и посмотри лог nginx, настрой запись в лог заголовков, при желании
При этом фиддлер показывает размер скачанных данных равный размеру файла, а чарльз вообще какую-то фигню - все время 50 килобайт, не важно - больше ты запросил, или меньше.
ну а как эти вещи могут быть связаны?
$p = fopen('http://www.example.com/');
while (!feof($p)) $buffer = freads($p); - хоть 100 гигабайт выкачивай, потребление памяти будет константой
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ну то есть читает кусками вряд ли.
Но тогда я не понимаю, куда он девает скачанное.
Здрасти, tcp-пакет - 8 кб, и никак иначе ничего по tcp читать невозможно, так работает транспортный уровень.
Ну, да, можно потюнить, но в жизни других размеров я не видел.
Каждый fread в цикле без задержек получает из буфера до 8 кб.
На уровне HTTP куски по 8 кб оборачиваются в чанки, HTTP wrapper эти чанки очищает от boundary-строк и склеивает.
А куда ты его деваешь - туда оно и девается :)
 
Сверху