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

时间:2016-11-22 11:07:49

标签: php symfony doctrine-orm symfony-2.8

我必须执行一个可以生成响应非常大的字符串的查询(最多1Gb),这基本上是一个大的,大的JSON数组。是的,分页是有序的,但我强调这个概念,以便让你了解。 Symfony只是使用学说来得到答案:

    $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);

然后我通过设置从执行返回的内容来创建Response

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

请注意,为了清楚起见,我过度简化了代码:我实际上有controllerhandler服务执行请求,Repository返回查询响应。

直接回答问题:这意味着PHP必须在内存中保存大量数据,我想知道是否有更轻松的方法来返回响应,以便减少带有大量数据的PHP引擎。< / p>

1 个答案:

答案 0 :(得分:4)

  

这意味着PHP必须拥有大量数据

PHP不需要在内存中保留整个响应主体。通过output buffers和Symfony response streaming,您可以逐行获取结果集并按块发送数据。不幸的是,我不知道PHP中JSON流编码的良好尝试解决方案,但您可以手动实现它(12)。

更新(2017-02-27):

  

Streaming JSON Encoder是一个PHP库,它提供了一组类来帮助以流方式编码JSON,即允许您逐位编码JSON文档,而不是一次编码整个文档。