使用StreamedResponse导出CSV

时间:2016-06-27 07:00:45

标签: php server export-to-csv symfony

我必须创建一个CSV导出。我找到了这个awesome service,我试图让它适应我的情况。这在我自己的计算机上运行得非常好(Windows 7,wamp 2.5没有修改)但是当我把它放在服务器上时(Ubuntu 14.04.4 LTS,PHP 5.5.9),这不再适用了。它似乎试图导出无限的数据流量,它可能会使服务器崩溃。我在Symfony 3.1.1上工作。这是我班级的代码:

public function exportCsv($affairesQuery, $em)
{
    $response = new StreamedResponse(function() use($affairesQuery, $em) {


        $results = $affairesQuery->iterate();
        $handle = fopen('php://output', 'r+');
        fputs($handle, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
        fputcsv($handle, [
            // My long list of headers
                ],
                ";");

        while (false !== ($row = $results->next())) {
            fputcsv($handle, $row[0]->toArray(), ";");
            $em->detach($row[0]);
        }

        fclose($handle);

    });
    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition','attachment; filename="Planning du '.date("Y-m-d h:i:s").".csv");

    return $response;
}

更新: 我试图在我的案例中使用goodby / csv,正如下面的评论所述,但我得到了完全相同的问题。这很奇怪,因为这不是同一种精神。

public function exportCsv($affairesQuery, $em)
{


    $stmt = $this->dbConnection->prepare($affairesQuery->getQuery()->getSQL());

    $n = 1;
    foreach($affairesQuery->getQuery()->getParameters()->toArray() as $value)
    {
        $stmt->bindValue($n, $value->getValue());
        $n++;
    }
    $response = new StreamedResponse();
    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'text/csv');
    $response->headers->set('Content-Disposition','attachment; filename="Planning du '.date("Y-m-d h:i:s").".csv");
    $response->setCallback(function() use($stmt) {
        $config = new ExporterConfig();
        $exporter = new Exporter($config);

        $exporter->export('php://output', new PdoCollection($stmt->getIterator()));
    });
    $response->sendContent();

    return $response;
}

0 个答案:

没有答案