Быстрое удаление рубрик и товаров в InstantShop

+14
3.27K
Обратил внимание, что если в инстант шопе попробовать удалить сразу много категорий, в которых очень много товаров, то система виснет напрочь. Выяснил, что происходит это из-за того что после каждого удаления товара происходит пересортировка:

  1.  
  2. public function deleteItem($id){
  3. ...
  4. ...
  5. $this->reorder('cms_shop_items_cats', 'category_id', 'item_id');
  6.  

Я решил переделать эти функции с таким алгоритмом: сначала удаляем все товары из категории без пересортировки, и уже в конце делаем эту пересортировку. И вы знаете, щас удаление происходит ОЧЕНЬ быстро!

  1.  
  2. /* ========================================================================== */
  3. /* ========================================================================== */
  4.  
  5. public function deleteItems($items) {
  6.  
  7. if (!is_array($items)){ return false; }
  8.  
  9. $list_categories = array(); //здесь мы сохраняем все категории, которые потом будем упорядочивать
  10. foreach($items as $item_id){
  11. $sql = "SELECT category_id, item_id FROM cms_shop_items_cats WHERE item_id={$item_id} GROUP BY category_id"; //получаем все категории где встречается товар
  12. $res = $this->inDB->query($sql);
  13. while($r = $this->inDB->fetch_assoc($res)){
  14. $list_categories[$r['category_id']] = $r['category_id'];
  15. }
  16.  
  17. $this->deleteItem($item_id, false); //удааляем товар БЕЗ упорядочивания (для скорости)
  18. }
  19.  
  20. foreach($list_categories as $key=>$category_id) {
  21. $this->reorderShopCategory($category_id);
  22. }
  23.  
  24. return true;
  25.  
  26. }
  27.  
  1.  
  2. /* ========================================================================== */
  3. /* ========================================================================== */
  4.  
  5. public function deleteItem($id, $reorder=true){
  6. //$reorder - говорит о том, надо ли потом делать упорядочивание
  7.  
  8. $imageurl = 'shop'.$id.'.jpg';
  9.  
  10. @chmod($_SERVER['DOCUMENT_ROOT']."/images/photos/$imageurl", 777);
  11. @chmod($_SERVER['DOCUMENT_ROOT']."/images/photos/small/$imageurl", 777);
  12. @chmod($_SERVER['DOCUMENT_ROOT']."/images/photos/medium/$imageurl", 777);
  13. @chmod($_SERVER['DOCUMENT_ROOT']."/images/photos/group/$imageurl", 777);
  14.  
  15. @unlink($_SERVER['DOCUMENT_ROOT'].'/images/photos/'.$imageurl);
  16. @unlink($_SERVER['DOCUMENT_ROOT'].'/images/photos/small/'.$imageurl);
  17. @unlink($_SERVER['DOCUMENT_ROOT'].'/images/photos/medium/'.$imageurl);
  18. @unlink($_SERVER['DOCUMENT_ROOT'].'/images/photos/group/'.$imageurl);
  19.  
  20. //удаляем дополнительные изображения
  21. $files = $this->getItemImages($id);
  22. $this->dropItemImages($files);
  23.  
  24.  
  25. $this->inDB->query("DELETE FROM cms_shop_items WHERE id={$id}");
  26. $this->inDB->query("DELETE FROM cms_shop_items_bind WHERE item_id={$id}");
  27. $this->inDB->query("DELETE FROM cms_shop_chars_val WHERE item_id={$id}");
  28. $this->inDB->query("DELETE FROM cms_shop_chars_val WHERE item_id={$id}");
  29. $this->inDB->query("DELETE FROM cms_tags WHERE target='shop' AND item_id = {$id}");
  30. $this->inDB->query("DELETE FROM cms_comments WHERE target = 'shop' AND target_id = {$id}");
  31. $this->inDB->query("DELETE FROM cms_ratings WHERE target = 'shop' AND item_id = {$id}");
  32.  
  33.  
  34. if($reorder) {
  35. $this->reorderShopItems($id);
  36. } else {
  37. $this->inDB->query("DELETE FROM cms_shop_items_cats WHERE item_id={$id}"); //эта функция вызывается в reorderShopItems, если она вызывается
  38. }
  39.  
  40. }
  41.  
  42.  
  1.  
  2. /* ==================================================================================================== */
  3. /* ==================================================================================================== */
  4.  
  5. public function reorderShopItems($item_id) {
  6.  
  7. if(!$item_id) return false;
  8. $sql = "SELECT category_id, item_id FROM cms_shop_items_cats WHERE item_id={$item_id} GROUP BY category_id"; //получаем все категории где встречается товар
  9. $res = $this->inDB->query($sql);
  10.  
  11. $this->inDB->query("DELETE FROM cms_shop_items_cats WHERE item_id={$item_id}");
  12.  
  13. while($r = $this->inDB->fetch_assoc($res)){
  14. $ord = 1;
  15.  
  16. $sql2 = "SELECT item_id
  17. FROM cms_shop_items_cats
  18. WHERE category_id = {$r['category_id']}
  19. ORDER BY ordering";
  20. $res2 = $this->inDB->query($sql2);
  21.  
  22. while($r2 = $this->inDB->fetch_assoc($res2)){
  23. $this->inDB->query("UPDATE cms_shop_items_cats SET ordering = {$ord} WHERE item_id={$r2['item_id']} AND category_id={$r['category_id']}");
  24. $ord++;
  25. }
  26.  
  27. }
  28.  
  29. return true;
  30.  
  31. }
  32.  


Было бы интересно услышать мнение гуру по этому поводу, а также можно ли еще как-то оптимизировать процесс удаления множества категорий?
0
abasia abasia 10 лет назад #
Полезно, спасибо+

Еще от автора

связка ishop и программа Покупка на Яндекс-маркете (2)
продолжение http://instantcms.ru/blogs/uluchshenija/svjazka-ishop-i-programa-pokupka-na-jandeks-markete.htmlпервой части
связка ishop и программа Покупка на Яндекс-маркете
Яндекс маркет позволяет заказывать товары непосредственно с яндекса - удобная штука.
Сортировка дополнительных картинок в шопе drag'n'drop
Сделал возможность перемещения дополнительных картинок в шопе: т.е. можно мышкой взять и перетащить картинку вверх-вниз, как требуется
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.