Kodėl Guzzle kūno srautas vis tiek gali būti buferizuojamas
Kūno sąsaja, transporto pristatymas ir jūsų pačių analizatorius gali buferizuoti nepriklausomai. Naudokite stream aiškiai ir išlaikykite vartojimą laipsnišką.
getBody() grąžina srauto sąsają net kai Guzzle jau atsisiuntė atsakymą. Norėdami paprašyti laipsniško tinklo pristatymo per perdavimo proxy, nustatykite stream užklausoje:
$response = $client->request('GET', 'https://example.com/stream', [
'proxy' => 'http://proxy.example:8080',
'stream' => true,
'read_timeout' => 10,
]);
$body = $response->getBody();
Tai naudoja esamą klientą; viešam HTTP galiniam taškui pasirinkite adresą iš HTTP proxy sąrašo ir pakeiskite pavyzdinio proxy URL. Srautinio perdavimo palaikymas priklauso nuo jo apdorojimo priemonės; vien srauto sąsaja negali pasakyti, ar apdorojimo priemonė kūną pristatė laipsniškai.
Kai atsakymas atvyks, toliau skaitykite ribotas dalis. $body konvertavimas į eilutę vėl surenka visą kūną. Eilučių analizatorius taip pat gali atrodyti pakibęs laukdamas naujos eilutės, nors tinklo baitai jau atvyko. Tai vartojimo vėlavimai, todėl proxy pakeitimas jų nepašalins.
read_timeout riboja atskirus skaitymo laukimus pagal palaikomą srauto įgyvendinimą. Jis nesuteikia begaliniam srautui dešimties sekundžių bendros trukmės. Atskirai tvarkykite skirtąjį laiką, EOF ir klaidas, o kūną uždarykite, kai apdorojimas baigiasi arba atšaukiamas.