Задать вопрос

Guzzle and big response?

Добрый вечер. Объясните пожалуйста, как действовать и как это обрабатывать.
Я делаю запрос к удаленному серверу, сервер возвращает массив в JSON представлении. В массиве может быть более 100 тысяч записей.
Примерно следующего вида
[
1 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
4 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
66 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
99 => ['index' => 'something', 'index' => 'something', 'sub_array' => ['el_1', 'el_2', 'el_3'],
]


Мне нужно получить весь массив, потом определенным образом его спарсить и положить все это дело в базу.
Чтобы получить данные массив я делаю запрос следующего вида
$guzzle = new \GuzzleHttp\Client();
$response = $guzzle->request('GET', $api_url, ['stream' => true])->getBody();
$response = $response->getContents();
$response = json_decode($response, true);


После чего в дело летит форич и я делаю свои грязные дела и на основе ответа, создаю 2 массива и добавляю в базу.
Но все время вылетаю по памяти, как можно этот момент исправить, чтобы не вылетать по памяти, но и не увеличивать ее объем.

И я не понимаю, я вылетаю на моменте персинга данных или, когда строю массив на основе ответа и в переменную попадает массив в котором более 30к элементов.
$data = array_chunk($response, 500, true);

Я предположил, что нужно чанкать ответ и проблема ушла, на первый взгляд все работало. Но мне нужно сохранять оригинальные ключи, следовательно, передав третьим аргументом true, проблема снова появилась.
  • Вопрос задан
  • 251 просмотр
Подписаться 4 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
New_Horizons
@New_Horizons
Бред:
Есть такая либа, для разбора json из стрима по частям.
https://github.com/salsify/jsonstreamingparser
Сам не пробовал, но вроде как она решает проблему нехватки памяти при больших объёмах json.

Вы пишете что на основе ответа создаёте другие массивы, так что возможно этот вариант не подойдёт, если нужны все данные сразу, чтобы создать эти массивы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы