Maison >développement back-end >tutoriel php >Optimisation de grandes données de données avec les réponses en streaming Laravel

Optimisation de grandes données de données avec les réponses en streaming Laravel

James Robert Taylor
James Robert Taylororiginal
2025-03-05 16:23:14847parcourir

Optimizing Large Data Delivery with Laravel Streaming Responses

La fonction de réponse en streaming de Laravel permet un traitement efficace des grands ensembles de données, en envoyant des données générées progressivement, en réduisant l'utilisation de la mémoire et en améliorant le temps de réponse.

Ce qui suit est un exemple simple montrant comment sortir 100 lignes de données à l'aide de la réponse en streaming:

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']);
});

Ensuite, examinons un exemple plus pratique pour démontrer comment diffuser l'exportation de données sur les grands commandes:

<?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'
        ]);
    }
}

Avec la réponse en streaming, nous pouvons traiter efficacement de grands ensembles de données tout en maintenant une empreinte de mémoire faible et en fournissant des commentaires instantanés aux utilisateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn