Hvorfor en Guzzle-body-stream fortsatt kan bli bufret
Body-grensesnittet, transportleveringen og din egen parser kan bufres uavhengig. Bruk stream eksplisitt og hold forbruket inkrementelt.
getBody() returnerer et stream-grensesnitt selv når Guzzle allerede har lastet ned svaret. For å be om inkrementell nettverkslevering gjennom en forward-proxy, sett stream på forespørselen:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
Dette bruker en eksisterende klient; for et offentlig HTTP-endepunkt, velg en adresse fra HTTP-proxy-listen og erstatt eksempel-proxy-URL-en. Streamingstøtte avhenger av handleren; stream-grensesnittet alene kan ikke fortelle deg om handleren leverte bodyen inkrementelt.
Når svaret ankommer, fortsett å lese begrensede deler. Konvertering av $body til en streng samler hele bodyen igjen. En linjeparser kan også se ut til å henge mens den venter på en ny linje, selv om nettverksbytes har ankommet. Dette er forbruksforsinkelser, så et bytte av proxy fjerner dem ikke.
read_timeout begrenser individuelle lesevekter under den støttede stream-implementasjonen. Det gir ikke en endeløs feed en total levetid på ti sekunder. Håndter timeout, EOF og feil separat, og lukk bodyen når behandlingen avsluttes eller avbrytes.