Perché uno stream del corpo di Guzzle può ancora essere memorizzato nel buffer
L'interfaccia del corpo, la consegna del trasporto e il tuo parser possono memorizzare nel buffer in modo indipendente. Usa stream esplicitamente e mantieni il consumo incrementale.
getBody() restituisce un'interfaccia di stream anche quando Guzzle ha già scaricato la risposta. Per richiedere una consegna di rete incrementale tramite un proxy forward, imposta stream sulla richiesta:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
Questo utilizza un client esistente; per un endpoint HTTP pubblico, scegli un indirizzo dalla lista di proxy HTTP e sostituisci l'URL del proxy di esempio. Il supporto dello streaming dipende dal suo handler; la sola interfaccia di stream non può dirti se l'handler ha consegnato il corpo in modo incrementale.
Una volta arrivata la risposta, continua a leggere porzioni limitate. Convertire $body in una stringa raccoglie di nuovo l'intero corpo. Un parser di righe può anche sembrare bloccato mentre attende una nuova riga, anche se sono arrivati byte di rete. Sono ritardi di consumo, quindi cambiare il proxy non li eliminerà.
read_timeout limita le singole attese di lettura nell'implementazione dello stream supportata. Non dà a un feed senza fine una durata totale di dieci secondi. Gestisci timeout, EOF ed errori separatamente e chiudi il corpo quando l'elaborazione termina o viene annullata.