php - 优化内存资源以响应大查询

标签 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);

然后我通过设置从执行返回的内容来创建一个响应

    $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 流编码的久经考验的解决方案,但您可以手动实现它( 12 )。

更新(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/

相关文章:

Symfony2 : Creating entity table conditionally

php - 研究redis

php - Doctrine 2 - 如何在关系中使用从缓存中检索的对象

php - Doctrine 2 复合键和 DQL 连接

php - 学说加入实体

php - 如何从二维数组中提取所有二级值(叶节点)并用逗号连接?

php - 将冗余的 MySQL 结果解析为结构化数组

php - 单元测试构造函数的最佳方法是什么?

php - 使用php/mysql根据表名分离数据

Symfony2 : onKernelResponse called twice as MASTER_REQUEST