Respuestas en streaming en Laravel: una guía para entregar datos de un modo eficiente

  • Publicado el 26 diciembre, 2024
  • Palabras: 114

¿Necesitas gestionar respuestas de gran tamaño de manera eficiente? ¡La función streaming de response de Laravel te permite enviar fragmentos de datos a medida que se generan! Exploremos esta poderosa técnica de optimización del rendimiento.

Respuestas en streaming en Laravel: una guía para entregar datos de un modo eficiente

#Uso básico

Al transmitir datos al cliente a medida que se generan, puede reducir significativamente el uso de memoria y mejorar el rendimiento, especialmente para respuestas muy grandes. Las respuestas en streaming permiten que el cliente comience a procesar los datos antes de que el servidor haya terminado de enviarlos. Esta es la forma más sencilla de crear una respuesta de streaming:

 

function streamedContent(): Generator {
    yield 'Hello, ';
    yield 'World!';
}
 
Route::get('/stream', function () {
    return response()->stream(function (): void {
        foreach (streamedContent() as $chunk) {
            echo $chunk;
            ob_flush();
            flush();
            sleep(2); // Simulate delay between chunks...
        }
    }, 200, ['X-Accel-Buffering' => 'no']);
});

 

#Ejemplo práctico

A continuación se muestra cómo puede utilizar el streaming para la generación de un informe grande:

 

class ReportController extends Controller
{
    public function downloadLargeReport()
    {
        return response()->stream(function () {
            // CSV Headers
            echo "ID,Name,Email,Created At";
            ob_flush();
            flush();

            // Process users in chunks
            User::query()
                ->chunk(1000, function ($users) {
                    foreach ($users as $user) {
                        echo sprintf(
                            "%d,%s,%s,%s",
                            $user->id,
                            $user->name,
                            $user->email,
                            $user->created_at
                        );
                        ob_flush();
                        flush();
                    }
                });
        }, 200, [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename="users.csv"',
            'X-Accel-Buffering' => 'no'
        ]);
    }

    public function streamActivityLog()
    {
        return response()->stream(function () {
            echo "<pre>";
            ob_flush();
            flush();

            Activity::query()
                ->orderBy('id', 'desc')
                ->chunk(100, function ($activities) {
                    foreach ($activities as $activity) {
                        echo sprintf("[%s] %s: %s",
                            $activity->created_at->format('Y-m-d H:i:s'),
                            $activity->user->name,
                            $activity->description
                        );
                        ob_flush();
                        flush();
                    }
                });
        }, 200, [
            'Content-Type' => 'text/plain',
            'X-Accel-Buffering' => 'no'
        ]);
    }
}

 

Las respuestas en streaming ayudan a reducir el uso de memoria y mejoran la experiencia del usuario al enviar datos a medida que se generan en lugar de esperar a que la respuesta completa esté lista.

Antonio Jenaro

Antonio Jenaro

Web Developer

Archivado en:

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión