Rumah >pembangunan bahagian belakang >tutorial php >Mengoptimumkan penghantaran data yang besar dengan respons streaming laravel

Mengoptimumkan penghantaran data yang besar dengan respons streaming laravel

James Robert Taylor
James Robert Taylorasal
2025-03-05 16:23:14847semak imbas

Optimizing Large Data Delivery with Laravel Streaming Responses

Ciri tindak balas streaming Laravel membolehkan pemprosesan yang cekap bagi set data yang besar, menghantar data yang dihasilkan secara bertahap, mengurangkan penggunaan memori dan meningkatkan masa tindak balas.

Berikut adalah contoh mudah yang menunjukkan cara mengeluarkan 100 baris data menggunakan tindak balas 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']);
});
Seterusnya, mari kita lihat contoh yang lebih praktikal untuk menunjukkan cara menstrimkan data pesanan besar eksport:

<?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'
        ]);
    }
}
Dengan tindak balas streaming, kami dapat memproses dataset yang besar sambil mengekalkan jejak memori yang rendah dan memberikan maklum balas segera kepada pengguna.

Atas ialah kandungan terperinci Mengoptimumkan penghantaran data yang besar dengan respons streaming laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn