Чому потік тіла 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 і помилки окремо та закривайте тіло, коли обробка завершується або скасовується.