Таблица Magento core_url_rewrite слишком велика

105

Я заметил большое количество сообщений о том, что эта таблица сама по себе может быть чрезвычайно загромождена, я работаю на сайте с ~ 5000 SKU и ~ 250 категориями (одно хранилище) и результирующей core_url_rewriteтаблицей размером более 600 000 строк и размером более 500 МБ, которые безумен

Это может замедлить работу сайта и привести к очень громоздкой базе данных. Я немного покопался и нашел немало постов по этому поводу, особенно:

// Эти ссылки были удалены с момента внедрения новых плат

Теперь я понимаю, что таблицу можно обрезать и переиндексировать, но это не решает проблему, а только продлевает повторение проблемы.

Из того, что я понимаю, часть проблемы - это продукты, которые имеют одинаковый URL-ключ в зависимости от названия продукта, что приводит к индексированным ссылкам.

Упомянутое исправление:

app/code/core/Mage/Catalog/Model/Url.php по строке ~ 807:

Изменить:

 if ($product->getUrlKey() == '' && !empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

Для того, чтобы:

 if (!empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

Но даже это не полностью решает проблему.

Мой вопрос заключается в следующем:

Если у вас возникла эта проблема, удалось ли вам создать эффективный, логичный и действенный алгоритм, который не предполагает повторного «управления» проблемой, а фактически решает проблему раз и навсегда?

Был бы очень признателен за понимание этого.

КСТАТИ: Пожалуйста, сделайте себе одолжение и проверьте, как выглядит ваш стол прямо сейчас, вы можете испытывать эту проблему и влияние на производительность в результате, даже не зная об этом - я не знал.

Изменить: я связывался с www.Nexcess.net (платиновый партнер Magento), и они подтвердили, что у них есть запрос клиентов, что их core_url_rewriteтаблица требует усечения из-за слишком громоздкого.

Мое большое беспокойство вызывает то влияние, которое это может оказать на SEO, поэтому я хотел бы найти решение, а не откладывать повторное возникновение проблемы.

Обновление: Nexcess упомянул, что с дублирующимися продуктами в таблице это может фактически навредить SEO, как оно есть.

лось
источник
Вау, это потрясающе большой стол. Я проверил свой собственный (200 продуктов), и в нем всего ~ 800 строк, но у нас нет проблем с дублированием названия продукта / URL-адресов. В качестве ориентира у нас есть около 6,6 строк на каждый видимый продукт. Я признаю, что это не ужасное реалистичное сравнение, но в таком случае с 5000 продуктами у нас было бы всего ~ 30 000 строк или около того. Я хорошо понимаю вашу потребность в решении и буду наблюдать за этим вопросом, поскольку я собираюсь реализовать гораздо больший сайт.
Pete855217
@ Pete855217: этот вопрос звучит интересно, даже если вы не проголосовали за него.
Мохаммад Фейсал
1
В EE1.12 была ошибка, из-за которой перезапись создавалась при каждом сохранении. Вполне возможно, что ваша версия 1.7 имеет такую ​​же ошибку. Насколько я помню патч для 1.12 тоже работал на 1.7
brentwpeterson
1
Очень полезная статья! У нас есть 130 000 активных продуктов и 25 000 отключенных продуктов, в нашей core_url_rewrite_table есть 2744023 записей ..... так что на этой неделе мы приступаем к исправлению этой проблемы! Эта статья выглядит хорошей отправной точкой.
MagentoMac
Отредактировал пост, чтобы включить, как не удалять ваши пользовательские переписывает в Magento.
espradley

Ответы:

76

Мне удалось стабилизировать проблему следующим образом:

Шаг 1: Перепишите модель URL каталога (используя собственный модуль: как сделать )

Примечание. Если перезаписать основной файл без перезаписи, это сделает ваш экземпляр Magento неспособным к будущим обновлениям.

Согласно решению Янни на доски MagentoCommerce(больше не активен с новой доской), app/code/core/Mage/Catalog/Model/Url.php[около строки 807 Mage_Catalog_Model_Url::getProductRequestPath()]

Из:

if ($product->getUrlKey() == '' && !empty($requestPath)
   && strpos($existingRequestPath, $requestPath) === 0
) 

Для того, чтобы:

if (!empty($requestPath)
           && strpos($existingRequestPath, $requestPath) === 0
) 

Шаг 2: усечь

Усекать core_url_rewriteтаблицу

Шаг 3: переиндексация и очистка кешей

Инициируйте процесс повторной индексации при перезаписи ядра URL. После этого вы захотите очистить кеш и хранилище Magento.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

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

лось
источник
5
Отлично, моя таблица core_url_rewrite была 3,2 ГБ, сейчас - 36,8 МБ: D от Маппет
Фабиан Блехшмидт
У меня похожая проблема. Magento URL переписать добавить случайное число в URL. Пожалуйста, посмотрите на скриншот, прикрепленный к инструментам Google Web Master. Как вы можете видеть, продукт «Бежевое вышитое свадебное сари» имеет девять разных URL-адресов, но это только один продукт, указывающий только на один URL-адрес, заканчивающийся на 878. Фактический URL-ключ не имеет случайного числа в конце (скриншот прилагается) ). Мой магазин довольно новый, а размер core_url_rewrite не такой большой. Поэтому я не уверен, стоит ли мне идти дальше и выполнить Шаг 1 и 2 или Только Шаг 1. Если я выполню шаг 2, я потеряю свои пользовательские изменения.
Зоя
Я бегу 1.9.1 и здесь пропущены URL скриншота. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Зоя
2
Я бы экспортировал существующую таблицу в первую очередь. Затем я перейду к шагам 1, 2 и 3. Посмотрите core_url_rewriteсейчас на таблицу и запишите количество записей. Снова выполните шаг 3 (переиндексация) и обновите представление core_url_rewriteтаблицы. Если число совпадает, вы успешно решили. Затем продолжайте и вручную объединяйте ваши пользовательские изменения. Всего наилучшего.
Лось
2
Это исправление работает только для продуктов, а не для категорий с одинаковыми ключами URL. См. Ответ @Simon's для лучшего решения (с файлом исправления)
Giel Berkers
45

Хотя я надеюсь, что кто-то здесь придет с ответом, я не знаю, найдете ли вы его. Эта таблица становится громоздкой по разным причинам. Ошибки в более ранних (и, возможно, текущих) версиях Magento - одна. Другая причина заключается в том, что в этой таблице есть логика, которая пытается отследить изменения значения ключа URL, чтобы 301/302 переписывания были настроены для старых продуктов. Из-за этого и усложнения вещей усечение таблицы и восстановление могут привести к тому, что существующие перезаписи URL исчезнут, и это окажет неизвестное влияние на список поисковых систем (не обязательно плохо, просто трудно предсказать).

Мой общий совет для клиентов, которые спрашивают

  1. Оставьте гигантскую растущую таблицу такой, как есть, если вы плохо разбираетесь в ситуации с URL / SEO

  2. Пока размер таблицы не станет проблемой (например, создание карт сайта). Когда это произойдет, выясните ситуацию с URL / SEO.

  3. После того, как вы разберетесь с ситуацией URL / SEO, сделайте резервную копию таблицы, затем обрежьте таблицу и восстановите ее. Решите любые проблемы URL / SEO, вызванные усечением.

  4. Автоматизировать шаг 3

Попытка исправить это на уровне кода Magento замечательна, но вы будете плыть вверх по течению. Иногда лучше принять, что «Это просто Magento, будучи Magento», и решить проблему с внешним процессом.

Алан Сторм
источник
спасибо за совет, жаль ситуации, но я думаю, что она должна быть обработана внешним процессом, как вы упомянули, ург.
Лось
2
Эта гигантская таблица уже может вызвать проблемы SEO, так как каноническое для данного продукта будет постоянно меняться. Если у вас есть отдельный магазин для мобильных и настольных компьютеров, это еще хуже, так как их URL будут отличаться.
Мелвин,
Немного неутешительный ответ для меня ...
Фра
@ Алан Сторм, как ты относишься к ответу, опубликованному Мусом после того, как ты опубликовал этот ответ? Видите ли вы те же риски?
Гусь
24

Я хотел бы добавить исправление для этой ошибки индексатора перезаписи URL, которая была разработана на bugathon в марте 2013 года и которая впоследствии была улучшена. Это должно решить эту проблему. В качестве ссылки вот файл патча по ссылке:

diff -rupN mage_org/app/code/core/Mage/Catalog/Model/Url.php src_shop/app/code/core/Mage/Catalog/Model/Url.php
--- mage_org/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:48:25.679009391 +0100
+++ src_shop/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:49:24.188005601 +0100
@@ -643,13 +643,24 @@ class Mage_Catalog_Model_Url
                 $this->_rewrite = $rewrite;
                 return $requestPath;
             }
+
+            // avoid unnecessary creation of new url_keys for duplicate url keys
+            $noSuffixPath = substr($requestPath, 0, -(strlen($suffix)));
+            $regEx = '#^('.preg_quote($noSuffixPath).')(-([0-9]+))?('.preg_quote($suffix).')#i';
+            $currentRewrite = $this->getResource()->getRewriteByIdPath($idPath, $storeId);
+            if ($currentRewrite && preg_match($regEx, $currentRewrite->getRequestPath(), $match)) {
+                $this->_rewrite = $currentRewrite;
+                return $currentRewrite->getRequestPath();
+            }
+
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
             $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
                 return $this->getUnusedPath($storeId, '-', $idPath);
             }
-            $match[1] = $match[1] . '-';
+            $match[1] = $noSuffixPath . '-'; // always use full prefix of url_key
+            unset($match[3]); // don't start counting with a possible number in the url_key
             $match[4] = isset($match[4]) ? $match[4] : '';

             $lastRequestPath = $this->getResource()


Кроме того, я хотел бы добавить патч EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, который теперь доступен на GitHub :

#!/bin/bash
# Patch apllying tool template
# v0.1.2
# (c) Copyright 2013. Magento Inc.
#
# DO NOT CHANGE ANY LINE IN THIS FILE.

# 1. Check required system tools
_check_installed_tools() {
    local missed=""

    until [ -z "$1" ]; do
        type -t $1 >/dev/null 2>/dev/null
        if (( $? != 0 )); then
            missed="$missed $1"
        fi
        shift
    done

    echo $missed
}

REQUIRED_UTILS='sed patch'
MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS`
if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 ));
then
    echo -e "Error! Some required system tools, that are utilized in this sh script, are not installed:\nTool(s) \"$MISSED_REQUIRED_TOOLS\" is(are) missed, please install it(them)."
    exit 1
fi

# 2. Determine bin path for system tools
CAT_BIN=`which cat`
PATCH_BIN=`which patch`
SED_BIN=`which sed`
PWD_BIN=`which pwd`
BASENAME_BIN=`which basename`

BASE_NAME=`$BASENAME_BIN "$0"`

# 3. Help menu
if [ "$1" = "-?" -o "$1" = "-h" -o "$1" = "--help" ]
then
    $CAT_BIN << EOFH
Usage: sh $BASE_NAME [--help] [-R|--revert] [--list]
Apply embedded patch.

-R, --revert    Revert previously applied embedded patch
--list          Show list of applied patches
--help          Show this help message
EOFH
    exit 0
fi

# 4. Get "revert" flag and "list applied patches" flag
REVERT_FLAG=
SHOW_APPLIED_LIST=0
if [ "$1" = "-R" -o "$1" = "--revert" ]
then
    REVERT_FLAG=-R
fi
if [ "$1" = "--list" ]
then
    SHOW_APPLIED_LIST=1
fi

# 5. File pathes
CURRENT_DIR=`$PWD_BIN`/
APP_ETC_DIR=`echo "$CURRENT_DIR""app/etc/"`
APPLIED_PATCHES_LIST_FILE=`echo "$APP_ETC_DIR""applied.patches.list"`

# 6. Show applied patches list if requested
if [ "$SHOW_APPLIED_LIST" -eq 1 ] ; then
    echo -e "Applied/reverted patches list:"
    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -r "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be readable so applied patches list can be shown."
            exit 1
        else
            $SED_BIN -n "/SUP-\|SUPEE-/p" $APPLIED_PATCHES_LIST_FILE
        fi
    else
        echo "<empty>"
    fi
    exit 0
fi

# 7. Check applied patches track file and its directory
_check_files() {
    if [ ! -e "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must exist for proper tool work."
        exit 1
    fi

    if [ ! -w "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must be writeable for proper tool work."
        exit 1
    fi

    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -w "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be writeable for proper tool work."
            exit 1
        fi
    fi
}

_check_files

# 8. Apply/revert patch
# Note: there is no need to check files permissions for files to be patched.
# "patch" tool will not modify any file if there is not enough permissions for all files to be modified.
# Get start points for additional information and patch data
SKIP_LINES=$((`$SED_BIN -n "/^__PATCHFILE_FOLLOWS__$/=" "$CURRENT_DIR""$BASE_NAME"` + 1))
ADDITIONAL_INFO_LINE=$(($SKIP_LINES - 3))p

_apply_revert_patch() {
    DRY_RUN_FLAG=
    if [ "$1" = "dry-run" ]
    then
        DRY_RUN_FLAG=" --dry-run"
        echo "Checking if patch can be applied/reverted successfully..."
    fi
    PATCH_APPLY_REVERT_RESULT=`$SED_BIN -e '1,/^__PATCHFILE_FOLLOWS__$/d' "$CURRENT_DIR""$BASE_NAME" | $PATCH_BIN $DRY_RUN_FLAG $REVERT_FLAG -p0`
    PATCH_APPLY_REVERT_STATUS=$?
    if [ $PATCH_APPLY_REVERT_STATUS -eq 1 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully.\n\n$PATCH_APPLY_REVERT_RESULT"
        exit 1
    fi
    if [ $PATCH_APPLY_REVERT_STATUS -eq 2 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully."
        exit 2
    fi
}

REVERTED_PATCH_MARK=
if [ -n "$REVERT_FLAG" ]
then
    REVERTED_PATCH_MARK=" | REVERTED"
fi

_apply_revert_patch dry-run
_apply_revert_patch

# 9. Track patch applying result
echo "Patch was applied/reverted successfully."
ADDITIONAL_INFO=`$SED_BIN -n ""$ADDITIONAL_INFO_LINE"" "$CURRENT_DIR""$BASE_NAME"`
APPLIED_REVERTED_ON_DATE=`date -u +"%F %T UTC"`
APPLIED_REVERTED_PATCH_INFO=`echo -n "$APPLIED_REVERTED_ON_DATE"" | ""$ADDITIONAL_INFO""$REVERTED_PATCH_MARK"`
echo -e "$APPLIED_REVERTED_PATCH_INFO\n$PATCH_APPLY_REVERT_RESULT\n\n" >> "$APPLIED_PATCHES_LIST_FILE"

exit 0


SUPEE-389 | EE_1.12.0.2 | v1 | 53c8ca52583358953b143aaa1a78cf409e8dd846 | Thu Jun 20 10:36:39 2013 +0300 | v1.12.0.2..HEAD

__PATCHFILE_FOLLOWS__
diff --git app/code/core/Mage/Catalog/Model/Url.php app/code/core/Mage/Catalog/Model/Url.php
index fa55fc5..a755b46 100644
--- app/code/core/Mage/Catalog/Model/Url.php
+++ app/code/core/Mage/Catalog/Model/Url.php
@@ -609,6 +609,23 @@ class Mage_Catalog_Model_Url
      */
     public function getUnusedPath($storeId, $requestPath, $idPath)
     {
+        $urlKey = '';
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey);
+    }
+
+    /**
+     * Get requestPath that was not used yet.
+     *
+     * Will try to get unique path by adding -1 -2 etc. between url_key and optional url_suffix
+     *
+     * @param int $storeId
+     * @param string $requestPath
+     * @param string $idPath
+     * @param string $urlKey
+     * @return string
+     */
+    public function getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey = '')
+    {
         if (strpos($idPath, 'product') !== false) {
             $suffix = $this->getProductUrlSuffix($storeId);
         } else {
@@ -645,21 +662,22 @@ class Mage_Catalog_Model_Url
             }
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
-            $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
+            $regularExpression = '#(?P<prefix>(.*/)?' . preg_quote($urlKey) . ')(-(?P<increment>[0-9]+))?(?P<suffix>'
+                . preg_quote($suffix) . ')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
-                return $this->getUnusedPath($storeId, '-', $idPath);
+                return $this->getUnusedPathByUrlkey($storeId, '-', $idPath, $urlKey);
             }
-            $match[1] = $match[1] . '-';
-            $match[4] = isset($match[4]) ? $match[4] : '';
+            $match['prefix'] = $match['prefix'] . '-';
+            $match['suffix'] = isset($match['suffix']) ? $match['suffix'] : '';

             $lastRequestPath = $this->getResource()
-                ->getLastUsedRewriteRequestIncrement($match[1], $match[4], $storeId);
+                ->getLastUsedRewriteRequestIncrement($match['prefix'], $match['suffix'], $storeId);
             if ($lastRequestPath) {
-                $match[3] = $lastRequestPath;
+                $match['increment'] = $lastRequestPath;
             }
-            return $match[1]
-                . (isset($match[3]) ? ($match[3]+1) : '1')
-                . $match[4];
+            return $match['prefix']
+                . (isset($match['increment']) ? ($match['increment']+1) : '1')
+                . $match['suffix'];
         }
         else {
             return $requestPath;
@@ -699,7 +717,7 @@ class Mage_Catalog_Model_Url
     {
         $storeId = $category->getStoreId();
         $idPath  = $this->generatePath('id', null, $category);
-        $suffix  = $this->getCategoryUrlSuffix($storeId);
+        $categoryUrlSuffix = $this->getCategoryUrlSuffix($storeId);

         if (isset($this->_rewrites[$idPath])) {
             $this->_rewrite = $this->_rewrites[$idPath];
@@ -713,27 +731,27 @@ class Mage_Catalog_Model_Url
             $urlKey = $this->getCategoryModel()->formatUrlKey($category->getUrlKey());
         }

-        $categoryUrlSuffix = $this->getCategoryUrlSuffix($category->getStoreId());
         if (null === $parentPath) {
             $parentPath = $this->getResource()->getCategoryParentPath($category);
         }
         elseif ($parentPath == '/') {
             $parentPath = '';
         }
-        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
-                                                                           true, $category->getStoreId());
+        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath, true, $storeId);

-        $requestPath = $parentPath . $urlKey . $categoryUrlSuffix;
-        if (isset($existingRequestPath) && $existingRequestPath == $requestPath . $suffix) {
+        $requestPath = $parentPath . $urlKey;
+        $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($categoryUrlSuffix, '/') . '$/i';
+        if (isset($existingRequestPath) && preg_match($regexp, $existingRequestPath)) {
             return $existingRequestPath;
         }

-        if ($this->_deleteOldTargetPath($requestPath, $idPath, $storeId)) {
+        $fullPath = $requestPath . $categoryUrlSuffix;
+        if ($this->_deleteOldTargetPath($fullPath, $idPath, $storeId)) {
             return $requestPath;
         }

-        return $this->getUnusedPath($category->getStoreId(), $requestPath,
-                                    $this->generatePath('id', null, $category)
+        return $this->getUnusedPathByUrlkey($storeId, $fullPath,
+            $this->generatePath('id', null, $category), $urlKey
         );
     }

@@ -798,7 +816,8 @@ class Mage_Catalog_Model_Url
             $this->_rewrite = $this->_rewrites[$idPath];
             $existingRequestPath = $this->_rewrites[$idPath]->getRequestPath();

-            if ($existingRequestPath == $requestPath . $suffix) {
+            $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($suffix, '/') . '$/i';
+            if (preg_match($regexp, $existingRequestPath)) {
                 return $existingRequestPath;
             }

@@ -836,7 +855,7 @@ class Mage_Catalog_Model_Url
         /**
          * Use unique path generator
          */
-        return $this->getUnusedPath($storeId, $requestPath.$suffix, $idPath);
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath.$suffix, $idPath, $urlKey);
     }

     /**
@@ -891,8 +910,8 @@ class Mage_Catalog_Model_Url
                 $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
                     true, $category->getStoreId());

-                return $this->getUnusedPath($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
-                    $this->generatePath('id', null, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
+                    $this->generatePath('id', null, $category), $urlKey
                 );
             }

@@ -913,14 +932,14 @@ class Mage_Catalog_Model_Url
                 $this->_addCategoryUrlPath($category);
                 $categoryUrl = Mage::helper('catalog/category')->getCategoryUrlPath($category->getUrlPath(),
                     false, $category->getStoreId());
-                return $this->getUnusedPath($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
-                    $this->generatePath('id', $product, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
+                    $this->generatePath('id', $product, $category), $urlKey
                 );
             }

             // for product only
-            return $this->getUnusedPath($category->getStoreId(), $urlKey . $productUrlSuffix,
-                $this->generatePath('id', $product)
+            return $this->getUnusedPathByUrlkey($category->getStoreId(), $urlKey . $productUrlSuffix,
+                $this->generatePath('id', $product), $urlKey
             );
         }

Если вы хотите использовать этот патч с CE, обязательно протестируйте его правильно, потому что он был разработан для EE.

Саймон
источник
Вы сами тестировали этот патч EE на CE?
Тайлер В.
@TylerV. Нету ...
Симон
3
Я пробовал этот патч в EE 1.9.1.1 и могу подтвердить, что он работает. Это устраняет проблему с продуктами и категориями с одинаковыми URL-ключами. Будем надеяться, что они скоро это реализуют.
Гиль Беркерс,
1
Спасибо Саймон, только что перешел с 1 ГБ до 3 МБ на одном клиентском веб-сайте ... Пришлось урезать его каждые 6 месяцев, надеюсь, он останется маленьким сейчас :)
Виллем Вигман
1
Я только что попробовал это на моем 1.9 CE и хотя это работает для продуктов - категории не совсем правильные. Если у меня есть категория с именем «Test», которая дает URL «... / test», а затем я создаю другую с именем «Test», она должна дать URL «... / test-2», но вместо этого даёт только номер, не имя: '... / - 2'
odd_duck
11

После того, как вы применили патч, опубликованный Саймоном, вы можете использовать следующий запрос для удаления ненужных данных:

DELETE FROM core_url_rewrite
WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$" AND
      (request_path REGEXP ".*-[0-9]*\.html" 
          OR target_path = request_path);

В отличие от запроса Ашиша Хира, это влияет только на те URL-адреса, которые имеют целое число, как и в последней части - это было - в моем случае - причиной беспорядка.

Он пытается не трогать действительные изменения, которые, например, могли быть созданы при обновлении ключа URL.

Alex
источник
6

Я успешно реализовал принятый ответ. При другой установке Magento мне нужно было сохранить некоторые пользовательские изменения, поэтому я удалил все записи, оканчивающиеся на -, а затем число длиной до 5 цифр с:

DELETE FROM `core_url_rewrite` WHERE `request_path` REGEXP '\\-[0-9]{1,5}$';

В основном это работало, но я все еще получаю еще 2 строки на каждый переиндекс. Не уверен почему. Я думал, что поделюсь этим опытом.

Энди Майерс
источник
1
Вы, вероятно, удалили действительные URL-адреса, которые заканчиваются числом. Вы найдете те с$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Мелвин
5

Основные изменения, о которых вы упомянули, кажутся необходимыми только в том случае, если у вас есть продукты без url_keys, однако Magento всегда должен создавать для вас url_keys. Если у вас есть какой-то импортер, который создает продукты без url_keys, то эта проблема возникнет для этих продуктов. Попробуйте выполнить следующий запрос, чтобы найти такие продукты:

SELECT cpe.entity_id, cpe.sku, cpev.value
FROM catalog_product_entity cpe
LEFT JOIN catalog_product_entity_varchar cpev
ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (
    SELECT attribute_id
    FROM eav_attribute
    WHERE `entity_type_id` = 4
    AND `attribute_code` = 'url_key'
)
WHERE cpev.value IS NULL OR cpev.value = ''

Если какие-либо продукты возвращаются из этого запроса, они не имеют url_key и будут проблемой.

Тайлер В.
источник
2
Имейте в виду, что по умолчанию entity_type_idдля продуктов 4, а не 10.
Simon
3

Я следовал утвержденному решению, чтобы предотвратить повторные перезаписи URL, а затем экспортировал core_url_rewriteкак файл CSV. Был в состоянии открыть этот CSV и удалить все, кроме созданных вручную перезаписей URL.

Затем я обрезал core_url_rewriteтаблицу и импортировал сохраненный файл CSV с переписанными вручную URL-адресами.

После всех изменений перешел с 940К строк на 32К. Огромное улучшение.

JonW
источник
3

Вот патч (локальная перезапись) для сообщества Magento для исправления, которое https://github.com/biotech/Magento-URL-Rewrite фактически делает то же самое, что и патч EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - проверяйте каждую перезапись и избегать создания дублированных записей. Хорошо работает последние 2 месяца на производстве CE 1.9, 15 тыс. Товаров, 4 магазина, полное переиндексация каждую ночь после изменений в импорте сыпучих продуктов.

FireBear
источник
Насколько тщательно это было проверено? Похоже, это было опубликовано всего час назад ....
SR_Magento
Это было исправлено в 1.9.2.x, так что нам больше не нужно беспокоиться о раздувании таблиц?
Fiasco Labs
Одиночные ссылки не являются лучшими ответами, даже если они могут решить проблему. Пожалуйста, объясните немного, что делает ваш код.
Мариус
@FiascoLabs да, хорошо работает на всех CE 1.9.x
FireBear
1
@FiascoLabs: 1.9.2.x по-прежнему имеет эту проблему «переписывания раздувания» и не включает это исправление, однако, как сказал FireBear, патч EE будет работать с CE 1.9.2.x. (лично не пробовал; хотел только уточнить, что 1.9.2.2 определенно все еще имеет эту проблему)
Эрик Сеастранд
2

Поскольку в этой теме об этом еще не упоминалось, я хотел бы поделиться интересной новостью о том, что эта проблема исправлена ​​в Magento 1.9.3.9 и более поздних версиях. Смотрите соответствующие примечания к выпуску :

Magento больше не выполняет ненужных операций записи в таблицу core_url_rewrite.

Таким образом, все исправления для этой проблемы, упомянутые здесь, не являются необходимыми при использовании версии Magento, большей или равной 1.9.3.9. Я все еще предлагаю удалить старые значения, как описано в ответе Алекса .

Саймон
источник
1

Запустите этот запрос

DELETE FROM core_url_rewrite WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$";

Это, безусловно, поможет вам уменьшить размер core_url_sizeтаблицы, удалив ненужные данные.

Асиш Хира
источник
Вы уверены, что это нежелательные данные? Я думаю, что он удалил также переписывает, которые были созданы при изменении URL-ключа!
Алекс
Проверьте регулярное выражение. это означает, что не имеют действительного идентификатора
Асиш Хира
Но эти идентификаторы также создаются при изменении ключа URL-адреса вручную в бэкэнде. Смотрите также мой ответ.
Алекс
0

Избавляться от .html

  1. Не используйте суффикс .html
  2. Установить в .htaccess

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. Стереть все .htmlперенаправления:

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'
lycenok
источник
0

Официальный ответ должен быть для установки SUPEE-389. Просто как тот.

Он отлично работает с Magento CE, поскольку они используют один и тот же кусок кода в этой области.

Вы можете найти файл патча здесь, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

У нас была эта проблема, и она генерировала тысячи новых строк после каждого повторного индекса URL каталога. Теперь проблема исчезла ... за исключением того, что мы должны очистить БД.

Сценарий, представленный здесь, кажется хорошим началом, но это не идеальное решение,

php shell / rewrites_doctor.php --remove_rewrites 4

См. Https://www.atwix.com/magento/duplicated-product-url-keys-in-community-edition/

Фредерик Готье-Бутин
источник
-2

Существует также специальный модуль https://github.com/vladsmirnov/url-rewrites , поэтому вам не нужно повторно применять патч после каждого обновления Magento. Модуль состоит из двух частей: самого модуля, чтобы предотвратить дублирование, и сценария оболочки для очистки существующей базы данных.

Владислав Смирнов
источник