Защо потокът на тялото на Guzzle все още може да се буферира
Интерфейсът на тялото, доставката по транспорта и вашият собствен парсер могат да буферират независимо. Използвайте stream изрично и поддържайте потреблението постепенно.
getBody() връща интерфейс за поток дори когато Guzzle вече е изтеглил отговора. За да поискате постепенна мрежова доставка през преден прокси, задайте stream в заявката:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
Това използва съществуващ клиент; за публична HTTP крайна точка изберете адрес от списъка с HTTP проксита и заменете примерния прокси URL. Поддръжката на потоци зависи от неговия обработчик; само интерфейсът за поток не може да ви каже дали обработчикът е доставил тялото постепенно.
След като отговорът пристигне, продължавайте да четете ограничени части. Преобразуването на $body в низ събира отново цялото тяло. Парсерът на редове също може да изглежда заседнал, докато чака нов ред, дори когато мрежовите байтове са пристигнали. Това са закъснения при потреблението, така че смяната на проксито няма да ги премахне.
read_timeout ограничава отделните изчаквания за четене при поддържаната реализация на поток. Той не дава на безкраен поток общ живот от десет секунди. Работете с изчакване, EOF и грешки поотделно и затваряйте тялото, когато обработката приключи или бъде отменена.