为大查询响应优化内存资源

optimizing memory resources for a big query response

我必须执行一个查询,该查询可以生成一个非常大的响应字符串(最大 1Gb),这基本上是一个很大很大的 JSON 数组。是的,分页是有序的,但我强调这个概念是为了让你明白。 Symfony 简单地使用 doctrine 来获得响应:

    $stmt = $this->getEntityManager()->getConnection()->prepare(self::Q_GET_NUM_TIMEBOX);

    $stmt->bindValue('t_end', $tEnd);
    $stmt->bindValue('t_granularity', $tGranularity);
    $stmt->bindValue('t_span', $varSelection->getStart());

    $stmt->execute();

    $resData = $stmt->fetchColumn(0);

然后我通过设置我在 return 中的内容来创建一个 Response 从执行。

    $res = new Response();
    $res->setStatusCode(200);
    $res->headers->set('Content-Type', 'application/json');
    $res->setContent($resData);

请记住,为了清楚起见,我过度简化了代码:我实际上有一个 controller、一个执行请求的 handler 服务和一个 Repository return查询响应。

直接回到问题:这意味着 PHP 必须在内存中保存大量数据,我想知道是否有更轻松的方法来 return 响应以强调较少 PHP 数据量大的引擎。

this implies that PHP must hold that big amount of data

PHP 不需要将整个响应主体保存在内存中。通过 output buffers and Symfony response streaming you can fetch result set row-by-row and send a data by chunks. Unfortunately I don't known well-tried solution for JSON stream encoding in PHP, but you can implement it manually (, ).

更新(2017-02-27):

Streaming JSON Encoder is a PHP library that provides a set of classes to help with encoding JSON in a streaming manner, i.e. allowing you to encode the JSON document bit by bit rather than encoding the whole document at once.