چرا جریان بدنهٔ 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 انتخاب کنید و نشانی پروکسی نمونه را جایگزین کنید. پشتیبانی جریان به هندلر آن بستگی دارد؛ رابط جریان بهتنهایی نمیتواند بگوید آیا هندلر بدنه را تدریجی تحویل داده است.
پس از رسیدن پاسخ، خواندن بخشهای محدود را ادامه دهید. تبدیل $body به رشته کل بدنه را دوباره جمع میکند. یک تجزیهکنندهٔ خطوط نیز ممکن است هنگام انتظار برای خط جدید معلق به نظر برسد، حتی وقتی بایتهای شبکه رسیدهاند. اینها تأخیرهای مصرف هستند، بنابراین تغییر پروکسی آنها را از بین نمیبرد.
read_timeout انتظارهای خواندن جداگانه را در پیادهسازی پشتیبانیشدهٔ جریان محدود میکند. به یک جریان بیپایان عمر کلی ده ثانیه نمیدهد. مهلت زمانی، EOF و خطاها را جداگانه مدیریت کنید و بدنه را وقتی پردازش پایان یافت یا لغو شد ببندید.