Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
IndexerReindexCommand.php
Go to the documentation of this file.
1 <?php
8 
15 use Symfony\Component\Console\Input\InputInterface;
16 use Symfony\Component\Console\Output\OutputInterface;
19 
24 {
28  private $sharedIndexesComplete = [];
29 
33  private $config;
34 
38  private $indexerRegistry;
39 
43  private $dependencyInfoProvider;
44 
50  public function __construct(
51  ObjectManagerFactory $objectManagerFactory,
52  IndexerRegistry $indexerRegistry = null,
53  DependencyInfoProvider $dependencyInfoProvider = null
54  ) {
55  $this->indexerRegistry = $indexerRegistry;
56  $this->dependencyInfoProvider = $dependencyInfoProvider;
57  parent::__construct($objectManagerFactory);
58  }
59 
63  protected function configure()
64  {
65  $this->setName('indexer:reindex')
66  ->setDescription('Reindexes Data')
67  ->setDefinition($this->getInputList());
68 
69  parent::configure();
70  }
71 
75  protected function execute(InputInterface $input, OutputInterface $output)
76  {
77  $returnValue = Cli::RETURN_FAILURE;
78  foreach ($this->getIndexers($input) as $indexer) {
79  try {
80  $this->validateIndexerStatus($indexer);
81  $startTime = microtime(true);
82  $indexerConfig = $this->getConfig()->getIndexer($indexer->getId());
83  $sharedIndex = $indexerConfig['shared_index'];
84 
85  // Skip indexers having shared index that was already complete
86  if (!in_array($sharedIndex, $this->sharedIndexesComplete)) {
87  $indexer->reindexAll();
88  if ($sharedIndex) {
89  $this->validateSharedIndex($sharedIndex);
90  }
91  }
92  $resultTime = microtime(true) - $startTime;
93  $output->writeln(
94  $indexer->getTitle() . ' index has been rebuilt successfully in ' . gmdate('H:i:s', $resultTime)
95  );
96  $returnValue = Cli::RETURN_SUCCESS;
97  } catch (LocalizedException $e) {
98  $output->writeln($e->getMessage());
99  } catch (\Exception $e) {
100  $output->writeln($indexer->getTitle() . ' indexer process unknown error:');
101  $output->writeln($e->getMessage());
102  }
103  }
104  return $returnValue;
105  }
106 
110  protected function getIndexers(InputInterface $input)
111  {
112  $indexers = parent::getIndexers($input);
113  $allIndexers = $this->getAllIndexers();
114  if (!array_diff_key($allIndexers, $indexers)) {
115  return $indexers;
116  }
117 
118  $relatedIndexers = [];
119  $dependentIndexers = [];
120  foreach ($indexers as $indexer) {
121  $relatedIndexers = array_merge(
122  $relatedIndexers,
123  $this->getRelatedIndexerIds($indexer->getId())
124  );
125  $dependentIndexers = array_merge(
126  $dependentIndexers,
127  $this->getDependentIndexerIds($indexer->getId())
128  );
129  }
130 
131  $invalidRelatedIndexers = [];
132  foreach (array_unique($relatedIndexers) as $relatedIndexer) {
133  if ($allIndexers[$relatedIndexer]->isInvalid()) {
134  $invalidRelatedIndexers[] = $relatedIndexer;
135  }
136  }
137 
138  return array_intersect_key(
139  $allIndexers,
140  array_flip(
141  array_unique(
142  array_merge(
143  array_keys($indexers),
144  $invalidRelatedIndexers,
145  $dependentIndexers
146  )
147  )
148  )
149  );
150  }
151 
158  private function getRelatedIndexerIds(string $indexerId)
159  {
160  $relatedIndexerIds = [];
161  foreach ($this->getDependencyInfoProvider()->getIndexerIdsToRunBefore($indexerId) as $relatedIndexerId) {
162  $relatedIndexerIds = array_merge(
163  $relatedIndexerIds,
164  [$relatedIndexerId],
165  $this->getRelatedIndexerIds($relatedIndexerId)
166  );
167  }
168 
169  return array_unique($relatedIndexerIds);
170  }
171 
178  private function getDependentIndexerIds(string $indexerId)
179  {
180  $dependentIndexerIds = [];
181  foreach (array_keys($this->getConfig()->getIndexers()) as $id) {
182  $dependencies = $this->getDependencyInfoProvider()->getIndexerIdsToRunBefore($id);
183  if (array_search($indexerId, $dependencies) !== false) {
184  $dependentIndexerIds = array_merge(
185  $dependentIndexerIds,
186  [$id],
187  $this->getDependentIndexerIds($id)
188  );
189  }
190  };
191 
192  return array_unique($dependentIndexerIds);
193  }
194 
202  private function validateIndexerStatus(IndexerInterface $indexer)
203  {
204  if ($indexer->getStatus() == StateInterface::STATUS_WORKING) {
205  throw new LocalizedException(
206  __(
207  '%1 index is locked by another reindex process. Skipping.',
208  $indexer->getTitle()
209  )
210  );
211  }
212  }
213 
220  private function getIndexerIdsBySharedIndex($sharedIndex)
221  {
222  $indexers = $this->getConfig()->getIndexers();
223  $result = [];
224  foreach ($indexers as $indexerConfig) {
225  if ($indexerConfig['shared_index'] == $sharedIndex) {
226  $result[] = $indexerConfig['indexer_id'];
227  }
228  }
229  return $result;
230  }
231 
238  private function validateSharedIndex($sharedIndex)
239  {
240  if (empty($sharedIndex)) {
241  throw new \InvalidArgumentException(
242  'The sharedIndex is an invalid shared index identifier. Verify the identifier and try again.'
243  );
244  }
245  $indexerIds = $this->getIndexerIdsBySharedIndex($sharedIndex);
246  if (empty($indexerIds)) {
247  return $this;
248  }
249  foreach ($indexerIds as $indexerId) {
250  $indexer = $this->getIndexerRegistry()->get($indexerId);
252  $state = $indexer->getState();
253  $state->setStatus(StateInterface::STATUS_VALID);
254  $state->save();
255  }
256  $this->sharedIndexesComplete[] = $sharedIndex;
257  return $this;
258  }
259 
266  private function getConfig()
267  {
268  if (!$this->config) {
269  $this->config = $this->getObjectManager()->get(ConfigInterface::class);
270  }
271  return $this->config;
272  }
273 
278  private function getIndexerRegistry()
279  {
280  if (!$this->indexerRegistry) {
281  $this->indexerRegistry = $this->getObjectManager()->get(IndexerRegistry::class);
282  }
283  return $this->indexerRegistry;
284  }
285 
290  private function getDependencyInfoProvider()
291  {
292  if (!$this->dependencyInfoProvider) {
293  $this->dependencyInfoProvider = $this->getObjectManager()->get(DependencyInfoProvider::class);
294  }
295  return $this->dependencyInfoProvider;
296  }
297 }
execute(InputInterface $input, OutputInterface $output)
$id
Definition: fieldset.phtml:14
__()
Definition: __.php:13
$objectManagerFactory
__construct(ObjectManagerFactory $objectManagerFactory, IndexerRegistry $indexerRegistry=null, DependencyInfoProvider $dependencyInfoProvider=null)