Почему поток тела 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 и ошибки отдельно и закрывайте тело, когда обработка завершается или отменяется.