Я работаю над скриптом cron, который попадает в API, получает файл JSON (большой массив объектов) и сохраняет его локально. Как только это будет завершено, другой скрипт должен проанализировать загруженный файл JSON и вставить каждый объект в базу данных MySQL.
В настоящее время я использую file_get_contents()
вместе с json_decode()
. Это попытается прочитать весь файл в памяти, прежде чем пытаться его обработать. Это было бы хорошо, за исключением того, что мои файлы JSON обычно будут варьироваться от 250 МБ-1 ГБ +. Я знаю, что могу увеличить свой предел памяти PHP, но это не кажется лучшим ответом на мой взгляд. Я знаю, что я могу запускать fopen()
и fgets()
чтобы читать файл в строковой последовательности, но мне нужно прочитать файл в каждом объекте json.
Есть ли способ читать в файле на объект или есть другой подобный подход?
Это действительно зависит от того, что содержат файлы json.
Если открыть файл, один снимок в память не является вариантом, то ваш единственный вариант, по которому вы ускользнули, будет fopen / fgets.
Чтение строки за строкой возможно, и если эти объекты json имеют согласованную структуру, вы можете легко обнаружить, когда json-объект в файле начинается и заканчивается.
Как только вы соберете целый объект, вы вставляете его в db, а затем переходите к следующему.
Это не так много. алгоритм для обнаружения начала и конца объекта json может усложняться в зависимости от вашего источника данных, но я делал что-то подобное раньше с гораздо более сложной структурой (xml), и он работал нормально.
попробуйте этот lib https://github.com/shevron/ext-jsonreader
Существующий ext / json, который поставляется с PHP, очень удобен и прост в использовании, но он неэффективен при работе с большими объемами данных JSON, поскольку он требует считывания всех данных JSON в память (например, с помощью file_get_contents ()), а затем превращая его в переменную PHP сразу – для больших наборов данных это занимает много памяти.
JSONReader предназначен для экономии памяти – он работает в потоках и может считывать данные JSON из любого потока PHP без загрузки всего данных в память. Он также позволяет разработчику извлекать определенные значения из потока JSON без декодирования и загрузки всех данных в память.
Наилучшее возможное решение:
Используйте какой-то разделитель (разбиение на страницы, временную метку, идентификатор объекта и т. Д.), Который позволяет вам читать данные в меньших фрагментах по нескольким запросам. Это решение предполагает, что у вас есть какой-то контроль над созданием этих файлов JSON. Я основываю свое предположение на:
Это было бы хорошо, за исключением того, что мои файлы JSON обычно будут варьироваться от 250 МБ-1 ГБ +.
Чтение и обработка 1 ГБ данных JSON просто смешно. Более определенно необходим более подходящий подход.