2016-11-22 1 views
2

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

+1

Использование StreamedResponse в сочетании с результатом итерационного запроса – Matteo

+0

@Matteo, который по-прежнему не решает проблему кодирования этих данных в JSON. – Gerry

+0

@Gerry не нужно кодировать. Postgres возвращает строку, хорошо закодированную. В основном функция, которую я написал, генерирует и возвращает ее – Bertuz

ответ

4

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

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

Update (2017-02-27):

Streaming JSON Encoder является PHP библиотека, которая предоставляет набор классов, чтобы помочь с кодированием JSON в потоковом способе, т.е. позволяет кодировать документ в формате JSON бит за битом, а не кодирование всего документа сразу.

Смежные вопросы