我必须执行一个查询,该查询可以生成一个非常大的字符串作为响应(高达 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);
然后我通过设置从执行返回的内容来创建一个响应
。
$res = new Response();
$res->setStatusCode(200);
$res->headers->set('Content-Type', 'application/json');
$res->setContent($resData);
请记住,为了清楚起见,我过度简化了代码:我实际上有一个 Controller
、一个执行请求的处理程序
服务和一个存储库
返回查询响应。
直接回到问题:这意味着 PHP 必须在内存中保存大量数据,我想知道是否有一种更简单的方法来返回响应,以减少对大量数据的 PHP 引擎的压力。
最佳答案
this implies that PHP must hold that big amount of data
PHP 不需要在内存中保留整个响应正文。通过output buffers和 Symfony response streaming您可以逐行获取结果集并按 block 发送数据。不幸的是,我不知道 PHP 中 JSON 流编码的久经考验的解决方案,但您可以手动实现它( 1 , 2 )。
更新(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.
关于php - 优化内存资源以响应大查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740262/