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.
#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
Web Developer
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