Для импорта товаров из больших прайсов (2000+ с загрузкой картинок) решил использовать BatchAPI. Загрузка 20-25 товаров проходит примерно за минуту (без batch раза в 3 быстрее) - ладно, мелочи. А когда я попробовал загрузить прайс на 2300 позиций - импорт одной позиции затянулся на 5 минут (100 позиций - примерно 2 минуты на позицию)! В чем тут может быть дело?
Комментарии
Ниже код
Дело в том что батчу тоже надо куда-то сохранять данные которые будут вытянуты во время процесса. Поэтому 5 минут это примерно тот интервал который требуется для записи всех данных. Ко всему прочему вы постоянно извлекаете все поля из sql по таблице продуктов и если у вас до этого было большое кол-во продуктов то логично что такая операция будет довольно время затратной (Возможно их мало тогда это не должно сильно влиять).
Первое что бросилось в глаза.
Второе непонятны характеристики вашего сервера.
Может быть жесткий медленный на сервере, у меня такое было, если у вас VPS, можете проверить с помощью hdparm, как-то так, примерно:
hdparm -Tt /dev/девайс
должно быть хотя бы 30 MB/sec, а лучше больше
Это все делается на локальной машине (денвер).
5 минут - это одна позиция импортилась. А сколько потребовалось бы на 2300 - можете сами посчитать. Я не ждал.
Я пробовал отрубить вообще весь процесс запросов, закачек, внутренних циклов и т.п. Т.е. оставил пустую функцию со счетчиком. Скорость увеличилась не больше чем в 2 раза. Т.е. простой счет до 2300 с итерацией за 2 минуты.
Хелп!
К сожалению код посмотреть не могу ибо кроме смартфона в данный момент из электроники ничего не имею, однако могу сказать что при правильном коде время выполнения пакетника почти не отличается от разовой функции. Так что ищите ошибку в коде.
Смог посмотреть файл со смартфона... лучше бы этого не делал...
В общем читать все лень, однако сразу в глаза бросилось подключение файлов в том числе CSS в основном коде, т.е. они будут вызываться всегда, даже на главной странице у анонимусов а так же сам файл inc, в 6 друпале был такой момент, что приходилось инклудить файлы с пакетниками в основном коде, иначе они просто висли, однако терялся всякий смысл выносить их в отдельные файлы, хотя может это у меня руки кривые
Если мне не изменяет память..
У вас алгоритм "формирования" bath-операции и выполнения не правильный
swu_import_import_quick - получается, что у вас за одну итерацию грузиться одна нода.. а одна итерация длиться вроде секунд 5-15(вызов функции загрузки(swu_import_import_quick) через 5-15 сек)..
Так что получается, даже без реального импорта время работы bath = 2300 х (время на одну итерацию)
А какой правильный?
Когда я весь цикл загрузки переместил в swu_import_import_quick, все делалось быстро, но без обновления процесса. Как я понял, обновление процесса происходит в конце batch-итерации
при формировании данных для bath (сабмит формы загрузки) все данные помещаем в один массив $values:
т.е. 1 нода = 1 элемент массива (получиться одна операция )
А в функции swu_import_import_quick уже циклом по $values грузим данные, 1 проход цикла - 1 нода.. $context['sandbox']['progress'] - индекс текущего элемента $values..
цикл - пока $context['sandbox']['progress'] меньше count($values)
Я не спорю, работать это будет, но обновления процесса не произойдет.
Я делал цикл с обновлением $context['sandbox']['progress'] после каждой операции цикла, но это ничего не давало. Пока функция swu_import_import_quick не завершалась, процесс стоял на 0. А потом сразу скачок на 100% и все.