Skip to content

Instantly share code, notes, and snippets.

@armetiz
Last active December 5, 2019 09:15
Show Gist options
  • Save armetiz/9c07e35eb66d7f492ac524ffab5a58c6 to your computer and use it in GitHub Desktop.
Save armetiz/9c07e35eb66d7f492ac524ffab5a58c6 to your computer and use it in GitHub Desktop.
Export CSV low memory fingerprint using iterator - HTTP Streamed Response & CLI
<?php
function csvToStdOut(array $headers, iterable $rows, string $delimiter = ','): void
{
$resource = fopen('php://output', 'wb');
fputcsv($resource, $headers, $delimiter);
foreach ($rows as $row) {
fputcsv($resource, $row, $delimiter);
}
fclose($resource);
}
$generator = function() {
foreach($names as $name) {
yield [
$name,
];
}
}
csvToStdOut(['name'], $generator());
<?php
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
function createStreamedResponseCSV(string $filename, array $headers, iterable $rows, string $delimiter = ','): Response
{
$response = new StreamedResponse(function () use ($headers, $generator) {
$resource = fopen('php://output', 'wb');
fputcsv($resource, $headers, $delimiter);
foreach ($rows as $row) {
fputcsv($resource, $row, $delimiter);
}
fclose($resource);
});
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
$filename
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Encoding', 'none');
$response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
return $response;
}
$generator = function() {
foreach($names as $name) {
yield [
$name,
];
}
}
$response = createStreamedResponseCSV('export.csv', ['name'], $generator());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment