Функція стрімінгових відповідей у Laravel дозволяє ефективно обробляти великі обсяги даних, поступово відправляючи інформацію в міру її генерації. Це допомагає зменшити використання пам'яті та покращує швидкість відповіді.
Route::get('/stream', function () {
return response()->stream(function () {
foreach (range(1, 100) as $number) {
echo "Line {$number}\n";
ob_flush();
flush();
}
}, 200, ['Content-Type' => 'text/plain']);
});
Розглянемо практичний приклад експорту великих даних у форматі CSV:
<?php
namespace App\Http\Controllers;
use App\Models\Order;
use Illuminate\Support\Facades\DB;
class ExportController extends Controller
{
public function exportOrders()
{
return response()->stream(function () {
// Виводимо заголовки CSV
echo "Order ID,Customer,Total,Status,Date\n";
ob_flush();
flush();
// Обробляємо замовлення частинами для збереження пам'яті
Order::query()
->with('customer')
->orderBy('created_at', 'desc')
->chunk(500, function ($orders) {
foreach ($orders as $order) {
echo sprintf(
"%s,%s,%.2f,%s,%s\n",
$order->id,
str_replace(',', ' ', $order->customer->name),
$order->total,
$order->status,
$order->created_at->format('Y-m-d H:i:s')
);
ob_flush();
flush();
}
});
}, 200, [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="orders.csv"',
'X-Accel-Buffering' => 'no'
]);
}
}
Стрімінгові відповіді дозволяють ефективно обробляти великі обсяги даних, зберігаючи низьке споживання пам'яті та забезпечуючи миттєвий зворотний зв'язок для користувачів.