我必须执行一个查询,该查询可以生成一个非常大的字符串作为响应(最多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);
请记住,为了清楚起见,我过度简化了代码:我实际上有一个controller
,一个执行请求的handler
服务和一个返回查询响应的Repository
。
回到问题:这意味着 PHP 必须在内存中保存大量数据,我想知道是否有一种更轻松的方法来返回响应,以便减少具有大量数据的 PHP 引擎的压力。
这意味着PHP必须保存大量的数据
PHP 不需要在内存中保留整个响应体。通过输出缓冲区和Symfony响应流,您可以逐行获取结果集并按块发送数据。不幸的是,我不知道在 PHP 中对 JSON 流编码的可靠解决方案,但您可以手动实现它 (1, 2)。
更新(2017-02-27):
流式 JSON 编码器是一个 PHP 库,它提供了一组类来帮助以流式方式对 JSON 进行编码,即允许您逐位编码 JSON 文档,而不是一次对整个文档进行编码。