оптимизация ресурсов памяти для ответа на большой запрос

Мне нужно выполнить запрос, который может генерировать в ответ очень большую строку (до 1 ГБ), которая в основном представляет собой большой-большой массив 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-движок большим объемом данных.


person Bertuz    schedule 22.11.2016    source источник
comment
использовать StreamedResponse в сочетании с итерируемым результатом запроса   -  person Matteo    schedule 22.11.2016
comment
@Matteo, который до сих пор напрямую не решает проблему кодирования этих данных в JSON.   -  person Gerry    schedule 22.11.2016
comment
@ Джерри не нужно кодировать. Postgres возвращает уже хорошо закодированную строку. В основном функция, которую я написал, генерирует и возвращает ее.   -  person Bertuz    schedule 22.11.2016
comment
Ic, я неправильно понял это из вопроса.   -  person Gerry    schedule 22.11.2016


Ответы (1)


это означает, что PHP должен хранить такой большой объем данных

PHP не обязан хранить в памяти все тело ответа. Через выходные буферы и Symfony потоковая передача ответов, вы можете получать набор результатов построчно и отправлять данные по частям. К сожалению, я не знаю надежного решения для кодирования потока JSON в PHP, но вы можете реализовать его вручную (1, 2).

Обновление (27 февраля 2017 г.):

Streaming JSON Encoder — это библиотека PHP, предоставляющая набор классов, помогающих с кодирование JSON в потоковом режиме, то есть позволяет вам кодировать документ JSON побитно, а не кодировать весь документ сразу.

person Timurib    schedule 22.11.2016