Дано: большой XML фид с объектами недвижимости в формате YML, используется Ларавель. Вопрос такой: как грамотнее парсить такие файлы?
Я могу за один запуск парсить, к примеру 5-10 объявлений (запись в базу + загрузка изображений на свой хост), чтобы не превышать время выполнения скрипта. Но при следующем запуске я опять буду читать эти же самые объявления, если фид не пополниться новыми.
Я думал создать таблицу в БД, в которую записывать id-шники новостей из фида, чтобы при парсинге проверять, смотрели ли я текущее объявление или нет. Но тогда, мне кажется, что эта таблица достаточно быстро начнёт раздуваться.
Каких-то других идей в голову не пришло. И буду благодарен, если подскажите, чем эффективнее парсить тяжёлые фиды.
UPD. Нужно сначала выкачать весь фид, а потом подкачивать новые записи, по мере обновления фида.
Google: поточный парсинг php
- не перезапускать скрипт
- если перезапускать то:
-- контролировать что файл не обновился
-- запоминать смещение в файле до которого уже распарсили
Обычно поточный парсер предполагает что:
- вы читаете файл с начала до конца
- по мере нахождения в файле объектов создаёте их в памяти, делаете над ними операции, а потом удаляете из памяти и переходите к следующему найденному объекту
- объекты ищутся по начальному токену (например ), потом объект собирается по заверщающий токен (например )
Когда освоите попробуйте парсить внешний источник без предварительного сохранения файла на диск. В случае сетевых ошибок:
- докачивать файл с момента получения ошибки - использовать http заголовок для чанков
- при докачки проверять не обновился ли файл - опять через http заголовки
- если файл обновился - принимать решение что парсить нужно с начала
Вы можете последний ID сохранять, и проверять больше ли он или нет. Либо дату.
Но вообще зависит от задачи, возможно лучше сохранять ID, и потом одним запросом в начале скрипта брать их и сверять с xml.
5000 объектов это очень мало, сохраняйте в таблице в которой храните объекты внешний ID из этого фида.
А в импорте просто выбирайте их все в массив и сверяйтесь, перебирая.
И просто в крон скрипт ставьте, он сам все выкачает постепенно.
Благодарю за совет. Да, распарсить получается. Правда, у меня есть 2 фида от разных поставщиков, в данном случае, наверное, лучше сделать отдельную таблицу с внешним ID и именем поставщика. И процесс загрузки фотографий в момент парсинга значительно замедляет работу скрипта.
Ну так необязательно их грузить сразу, можно же и очередь создать.
Например таблицей в которую импорт заносит задания на скачивания картинок, а скрипт постоянно запускающийся в кроне их скачивает и удаляет задания из очереди.
Но тогда возникнут проблемы с тем, что у Вас на сайте будут объекты без фото на сайте, их скрывать придется.
Так что я думаю оптимальный вариант просто сверять всю базу скачивать их потихоньку.
Время потратится только когда выкачивать будете, если база 5000 объектов, то явно там не так много обновляется, так что скрипт потом должен шустро работать.
Создавайте команду, вешайте на крон. В консольном режиме нет никакого ограничения на время, вытащили фид, прошлись xmlreader, раз большой. никаких заморочек не надо. если совсем уж припрёт, можно использовать очереди, благо в ларке они из коробки