Есть простой импорт данных каталога из 1С на сайт. 1С загружает csv файл в папку и обращается к php файлу импорта(GET запрос). В этом файле идет добавление данных в бд.
Проблема в том что с недавнего времени началось дублирование данных. Каждая позиция каталога добавлена 2 раза, в файле лога содержится двойной текст сообщения. Как будто скрипт одновременно запущен(открыт) с 2 мест. Причем такое дублирование происходит не всегда, похоже что через 1-2 раза. В самом скрипте видимых ошибок нет, к тому же долгое время все работало нормально.
С 1С не знаком и нет доступа, поэтому со стороны 1С посмотреть не могу.
Прошу подсказать в чем и с какой стороны(сайт/1С) может быть причина такой ошибки.
Ответ
посмотреть в access логи веб-сервера, увидите, скорее всего, дублированные запросы.
чтобы вылечить ошибку, можете лочить (создать лок-файл с именем равным ip-адресу клиента, допустим) выполнение импорта при старте скрипта для каждого ip-адреса, в конце скрипта - удалять файл. если файл с таким ip существует, не делать ничего.
т.е. в любой момент времени с 1-го айпи будет возможен только один процесс импорта.
можно доработать скрипт по-другому.
сохраняете куда-нибудь md5(file_get_contents("old_csv_file")), сравниваете md5(file_get_contents("new_csv_file")), если они равны - ничего не делаете.
потом сходить к программисту 1с и настучать по голове, если он почему-то отправляет двойные запросы.
и да, проверить свой код на всякий случай, чтобы вы сами в исследовательских целях где-нибудь не оставили двойную вставку данных в бд, конечно же.
P.S.
в любом случае, вставить проверку на добавление дублирущихся данных будет хорошим тоном. Лучше даже не делать это на уровне php-скрипта, а делать на уровне БД.
если у вашего прайс-листа есть, допустим, артикул, сделайте его в БД уникальным ключом и в случае появления дублирующихся данных просто апдейтить текущие значения.
лучше всего - реализовать и md5-проверку и перезапись в бд, вдруг 1с начнет присылать прайслисты, которые содержат и дубликаты и уникальные значения, но при этом в целом данные отличаются от предыдущего прайс-листа.
ваша задача как программиста - или предусмотреть максимально возможное количество решений работы с плохими данными, или не давать загружать плохие данные вовсе, чтобы ребята на той стороне не расслаблялись. Это, в конечном итоге, зависит от ваших бизнес-задач.
Комментариев нет:
Отправить комментарий