Оптимізація доставки великих обсягів даних за допомогою Streaming Responses у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 08 січня, 2025
У статті розглядається, як функція потокових відповідей у Laravel дозволяє ефективно обробляти великі обсяги даних, знижуючи використання пам'яті та покращуючи час відповіді. Долучайтеся до нас, щоб дізнатися, як реалізувати експорт даних у CSV-форматі за допомогою практичного прикладу!

Функція стрімінгових відповідей у 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'
        ]);
    }
}

Стрімінгові відповіді дозволяють ефективно обробляти великі обсяги даних, зберігаючи низьке споживання пам'яті та забезпечуючи миттєвий зворотний зв'язок для користувачів.