-
Notifications
You must be signed in to change notification settings - Fork 41
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Порционная обработка данных очередями через рекурсивный вызов #2
Comments
Дело в том, что все изменения (добавление, удаление, обновление данных) приходиться делать через методы API WordPress и WooCommerce, а не через прямые запросы к БД. Т.к. иначе не будет вызываться множество обработчиков и хуков, которыми обвешен код WordPress и WooCommerce. Например, простое добавление категории делается через функцию wp_insert_term. Можно посмотреть, сколько кода и запросов зашито в её реализацию: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/taxonomy.php#L2547. Ещё во многих окружениях веб-серверов стоит ограничение на время выполнения, поэтому плагин может не успеть импортировать большое количество данных. Т.е., в теории, продолжительность обмена прямо зависит от количества данных от 1С и обратно — от производительности сервера. Но даже на VPS за $5 у меня получалось импортировать десятки тысяч наименований, просто это занимало порядка 15 минут. С загрузкой больших файлов же проблем, как правило, нет: он может передаваться частями и в zip-архиве. Да, добавить пошаговый импорт было бы хорошо, чтобы не требовать от пользователей VPS или изменения max_execution_time. Но на момент начала разработки для меня это было большим усложнением. Например, в этом случае, скорее всего, понадобилось бы сохранять данные из 1С в промежуточные таблицы, т.к. единственный способ узнать, что на 1С удалились данные — сравнить новые данные с теми, что были импортированы в предыдущих обменах. |
Я сам против использования прямых SQL запросов. Но порционная обработка никак с этим не связана. Я сомневаюсь что нужно сохранять данные в некие промежуточные таблицы. Если говорить о механизме удаления старых продуктов, то можно придумать так:
Могу ошибаться в деталях, но как то так это должно работать с возможными корректировками. Что же касается порционной обработки. То к примеру в системе МойСклад это легко реализуемо тк мы можем задавать отступ запроса данных, типа взять с 0 по 100 или с 100 по 200. И таким образом забирая только нужную порцию данных из МойСклад. В случае с 1С как я понял на сайт попадает некий CommerceML файл, в котором изначально все данные уже есть. Таким образом нам нужно лишь попробовать брать из него не все данные за раз, а только с 0 по 100 записи. И далее с 100 по 200 и далее с 200 по 300. Вот как это сделать - это отдельный вопрос. Который я пока что не представляю, но думаю что если вникнуть в детали, то разберемся. И как только мы выясни как это сделать, то далее уже подойдет мой механизм который опубликова тут, с мелкими корректировками, и получим в результате порционную обработку с защитой от ошибок по таймауту. |
В общем у нас проект на старте, мы там заложили достаточный бюджет чтобы эту проблему порешать. И если все срастеться то по ходу настройки заодно порешаем эту задачу. |
This comment has been minimized.
This comment has been minimized.
Получилось у Вас сделать порционную выгрузку? |
С 1С так ничего и не вышло. Бюджета не хватило на проект. Сейчас сосредоточились на МойСклад https://github.com/wpcraft-ru/wooms/ Там эту проблему решили так:
|
Где то читал что для работы плагина нужен сервер сайта помощнее, чтобы принять большой массив данных при первой синхронизации.
С чем связана эта проблема? С загрузкой самого файла на сайт? Или с обработкой этого файла уже на сайте?
Первый вариант мало верится.
Если второй вариант, то мы как то решали эту проблему, переписав функцию на рекурсивную обработку очередями. Вот некий пример http://wpcraft.ru/primer-massovoj-obrabotki-postov-v-wordpress-s-proslushkoj-cherez-hearbeat-api/
Как думаешь реально ли переписать механизм этого плагина на подобный?
Или могут быть какие то проблемы?
The text was updated successfully, but these errors were encountered: