【问题标题】:Magento Re- Indexing IssueMagento 重新索引问题
【发布时间】:2012-09-10 08:29:28
【问题描述】:

我在 Magento 中遇到了一个问题。我有一个具有多网站功能的 Magento 商店,其中包含大约 4500 种产品。我想重新索引产品。

我通过 magento 默认功能通过 csv 导入了 4500 个产品。导入产品后,更改未显示在前端,所以我去索引管理,我发现有两个索引处于处理状态

1 产品属性 2 产品平面数据

我已经完成了以下步骤:

1 尝试从管理端系统重新索引它->索引管理

2尝试通过调用php脚本手动进行

require_once 'app/Mage.php';
umask( 0 );
Mage :: app( "default" );
$process = Mage::getSingleton('index/indexer')->getProcessByCode('catalog_product_flat');
$process->reindexAll();

$indexingProcesses = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
foreach ($indexingProcesses as $process) {
    $process->reindexEverything();
}

还将 var/locks 文件夹权限更改为 777 并重命名该文件夹并尝试删除在此锁定文件夹中创建但未得到解决方案的 .lock 文件。

我没有 SSH 权限。那么有没有其他解决方案可以帮助我解决重新索引问题。

【问题讨论】:

  • 实际问题是什么?您已经提到了几种尝试重新索引的方法,但您实际上并没有提到为什么到目前为止任何方法都不足。
  • 您好 Will,我通过 magento 默认功能通过 csv 导入了 4500 个产品。导入产品后,更改未显示在前端,所以我去索引管理,我发现有两个索引处于处理状态 1 产品属性 2 产品平面数据
  • 当索引长时间卡在“处理中”状态时,可能是magento的var目录下的lockfiles权限不对。每当 Magento 无法获得锁时,它就会将索引列为“正在处理”,而无需检查失败的原因。除了索引处理实际上被锁定之外,未能获取锁的最常见原因是锁已由不同的用户帐户创建。 (例如,如果cronroot 运行,而magento 通常由apache 用户访问)。确保 magento 对锁具有写访问权限。
  • 谢谢,但是现在该怎么做才能解决这个问题,我在过去两天遇到了这个问题,这让我非常沮丧我还重命名了 var/lock 文件夹,并且 index_process_4 中有两个文件.lock & index_process_1.lock
  • 您重命名了var/lock 文件夹并在旧位置重新创建了两个锁?

标签: magento


【解决方案1】:

注意:根据我的经验,虽然以下答案与此类问题有关,但它似乎不是提问者当前遇到的情况的原因

Processing 表示以下两种情况之一:

  • 索引实际上可能仍在运行,在这种情况下,请坐等它们完成。 Magento 索引可能需要很长时间(对于 4500 个产品,“小时”是可能的,具体取决于服务器)。

  • 索引器进程可能已终止,留下过时的锁。同时,失效的索引器可能已由其他用户运行。最常见的情况是cron 被错误地配置为以root 或普通用户帐户运行索引器,而不是作为网站使用的同一用户(例如:apachewww)。

Processing 真正的意思是“Magento 未能为这些索引器作业获取锁”。第一个案例是微不足道的和无趣的。等待几个小时,如果 same 索引器仍列为Processing,那么您可能遇到第二种情况。

检查锁定文件的权限,在您的 magento 根目录下的 var/locks 下找到。它们是否与运行 Web 服务器的用户相同?如果不是,并且您绝对确定索引不再运行,删除锁是安全的。下一步是首先找出锁具有错误权限的原因。如果您没有ssh 访问权限,那么与您的主机进行对话可能会更好。

【讨论】:

    【解决方案2】:

    默认情况下,来自索引器的错误将被捕获且不记录。典型的解决方法是使用 CLI 重新索引工具;这将是非常冗长的任何错误。

    例如。

    php shell/indexer.php --reindex ...
    

    但鉴于您没有 SSH 访问权限 - 您可以查看 indexer.php 文件以了解它们如何生成错误,或者您可以从基于 Web 的 PHP 启动 shell_execexec模拟 CLI 的脚本。

    【讨论】:

      【解决方案3】:

      原因

      catalog_product_flat_% 表中存在对不存在/已删除产品的引用。

      解决方案

      尝试在 MySQL 控制台或通过 phpMyAdmin 截断“catalog_product_flat_%”表(catalog_product_flat_1、catalog_product_flat_2、catalog_product_flat_3 等):

      mysql > truncate table ´catalog_product_flat_1´;
      mysql > truncate table ´catalog_product_flat_2´;
      mysql > truncate table ´catalog_product_flat_3´;
      

      然后重新索引。

      【讨论】:

      • 这不会导致索引静默失败,而不是永久标记为“处理中”吗?
      • 我必须在不影响数据库的情况下进行索引 - Palanikumar
      • @Palanikumar : 如果我运行这些命令,会删除我的产品目录还是对已经添加的产品没有影响。
      【解决方案4】:

      我无法重新索引catalog_product_flat 索引进程。花了一天时间在互联网上尝试了几种解决方案。我能够解决这个问题。以下是步骤。

      1. 创建面临索引问题的 Magento Db 的克隆。
      2. 将数据库转储到新创建的数据库中。
      3. 为单个存储截断表catalog_product_flat_1,对于多个存储将有多个表catalog_product_flat_*,其中* 是存储ID。此处截断所有表格。
      4. 将mangento运行实例指向新创建的数据库并配置数据库,使站点正常运行。
      5. 现在运行命令php document_root/shell/indexer.php --reindex catalog_product_flat 或尝试从管理员重新索引。 php document_root/shell/indexer.php --reindexall 重新索引所有进程。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,在创建新客户组时我无法重新索引价格。

        在这里找到解决方案http://www.magikcommerce.com/blog/how-to-resolve-magento-reindexing-errors-in-your-magento-store/

        流程如下:

        1. 找到 var/locks 目录并删除该目录下的所有文件。这将清除所有锁定,以便再次进行重新索引。

        2. 现在,登录您的 MysQSL/phpMyAdmin 以运行以下 MySQL 查询(确保您在提交此 MySQL 查询之前已进行完整备份)

          删除 cpop.* FROM catalog_product_option_price AS cpop INNER JOIN catalog_product_option AS cpo ON cpo.option_id = cpop.option_id 在哪里 cpo.type = '复选框' 或 cpo.type = '收音机' 或 cpo.type = 'drop_down';

          DELETE cpotp.* FROM catalog_product_option_type_price AS cpotp
          INNER JOIN catalog_product_option_type_value AS cpotv
          ON cpotv.option_type_id = cpotp.option_type_id
          INNER JOIN catalog_product_option AS cpo
          ON cpotv.option_id = cpo.option_id
          WHERE
          cpo.type <> 'checkbox' AND
          cpo.type <> 'radio' AND
          cpo.type <> 'drop_down';
          
        3. 重新登录到您的 Magento 管理面板并转到系统选项卡 > 索引管理再次点击索引,您会注意到不会再次出现此类错误。如果将来停止重新索引以解决 Magento ReIndexing 问题,您可以再次执行这些相同的步骤。

        【讨论】: