Skip to content

Ubercart и автоматическое создание продуктов с файлами

25/01/2011

Ubercart

При автоматическом создании продуктов с файлами в Ubercart версии 1.10 был замечен странный баг — добавление каждого следующего продукта занимало всё больше времени. В целом надо было создать более двадцати тысяч продуктов с прикреплёнными файлами для скачивания, и последние продукты добавлялись по 5 минут. Решено было выяснить, в чём проблема.

Многократный проход по коду с XDEBUG принёс свои результаты. Проблема, как оказалось, кроется в механизме скачиваемых файлов Ubercart, в модуле uc_file. Каждому файлу соответствует запись в таблице uc_files. И при каждой отправке формы, привязывающей файл на диске к продукту, вся директория с файлами рекурсивно проходилась и для всех новых файлов делались записи в uc_files. При обычном режиме с сотней-другой файлов и ручным созданием продуктов это не играет большой роли. Но как только файлов становится много, задержка на эту проверку становится весьма ощутимой.

В результате я решил изменить код модуля uc_file таким образом чтобы форма добавления файла к продукту действовала в двух режимах:

  • Ручной режим — вся директория с файлами просматривается при каждом добавлении продукта с файлом, для всех новых файлов делаются записи в uc_files

  • Автоматический режим — при вызове той же формы с необязательным параметром (именем файла) директория не просматривалась, а проверялся только переданный файл. Если для него не было записи в uc_files, она добавлялась.

В самом деле, если мы явно знаем какой файл будет добавлен в продукт, нам нет необходимости прочёсывать всю директорию — достаточно убедиться что этот конкретный файл уже есть. В результате понадобились такие правки:

  • Функция uc_file_feature_form, отвечающая за добавление файла к продукту, принимает лишний необязательный параметр $filename. Если он обнаружен, он передаётся без изменений вторым параметром в функцию _file_table_action.
  • Функция _file_table_action в ветке insert проверяет передан ли первый аргумент, и если да, пропускает рекурсивное сканирование директории и добавляет только файл, переданный первым аргументом.
  • При автоматическом добавлении файла к продукту в генератор форм последним параметром передаётся нужный файл (drupal_execute('uc_file_feature_form', $form_values, $product, array(), $filename);)

В результате при пакетном создании файлов время создания каждого продукта снизилось с ~300 секунд до 0.22 секунды. Соответственно, исправлять ошибки при генерации файлов (требующие пересоздания всех продуктов) или просто создавать новые серии продуктов стало гораздо проще.

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: