📜  在发布 api magento 2 后重新索引 - PHP (1)

📅  最后修改于: 2023-12-03 15:23:31.528000             🧑  作者: Mango

在发布 API Magento 2 后重新索引 - PHP

当您在Magento 2中发布新API后,您需要重新索引以确保数据的正确性和可访问性。以下是如何在PHP中重新索引Magento 2的步骤。

步骤 1 - 引入Magento 2启动脚本

首先,您需要在PHP脚本中引入Magento 2的启动脚本。您可以使用以下代码:

require_once '/path/to/magento/app/bootstrap.php';

$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
步骤 2 - 获取索引程序类

在获取索引程序类之前,您需要注入两个依赖项:Magento\Framework\Indexer\StateInterfaceMagento\Framework\Indexer\IndexerRegistry

您可以使用以下代码注入这些依赖项:

use Magento\Framework\Indexer\IndexerRegistry;
use Magento\Framework\Indexer\StateInterface;

class Indexer
{
    /**
     * @var \Magento\Framework\Indexer\IndexerInterface[]
     */
    private $indexers;

    /**
     * @var \Magento\Framework\Indexer\StateInterface
     */
    private $state;

    /**
     * Indexer constructor.
     *
     * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry
     * @param \Magento\Framework\Indexer\StateInterface $state
     */
    public function __construct(
        IndexerRegistry $indexerRegistry,
        StateInterface $state
    ) {
        $this->indexers = $indexerRegistry->get();
        $this->state = $state;
    }
}
步骤 3 - 暂停所有索引程序

在重新索引之前,您需要暂停所有的索引程序。这可以确保您的数据是安全的,并减少索引程序运行期间的问题。您可以使用以下代码暂停所有索引程序:

$indexer = $objectManager->get('Magento\Framework\Indexer\IndexerRegistry');
$indexerList = $indexer->getIndexers();
foreach ($indexerList as $indexer) {
    $indexer->getState()->setMode(\Magento\Framework\Indexer\StateInterface::MODE_MANUAL);
}
步骤 4 - 重新索引

现在,您可以开始重新索引。您可以使用以下代码重新索引:

foreach ($this->indexers as $indexer) {
    $indexerCode = $indexer->getId();
    try {
        $this->state->setStatus($indexerCode, StateInterface::STATUS_WORKING);
        $indexer->reindexAll();
        $this->state->setStatus($indexerCode, StateInterface::STATUS_VALID);
        $this->state->save();
    } catch (\Exception $e) {
        $this->logger->error(__('Error occurred during %1 reindexing process. %2', $indexerCode, $e->getMessage()));
        $this->state->setStatus($indexerCode, StateInterface::STATUS_INVALID);
        $this->state->save();
    }
}
步骤 5 - 恢复所有索引程序

最后,您需要重启所有索引程序。您可以使用以下代码恢复所有索引程序:

foreach ($indexerList as $indexer) {
    $indexer->getState()->setMode(\Magento\Framework\Indexer\StateInterface::MODE_REAL_TIME);
}

现在,您已经成功地使用PHP重新索引Magento 2!请确保在重新索引之前备份您的数据以防万一。