silverstripe-fulltextsearch/src/Solr/Reindex/Handlers/SolrReindexImmediateHandler...

124 lines
3.6 KiB
PHP
Raw Normal View History

<?php
2017-04-21 02:27:01 +02:00
namespace SilverStripe\FullTextSearch\Solr\Reindex\Handlers;
use Psr\Log\LoggerInterface;
use SilverStripe\Control\Director;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Environment;
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\FullTextSearch\Solr\Solr;
use SilverStripe\FullTextSearch\Solr\SolrIndex;
use SilverStripe\ORM\DB;
use Symfony\Component\Process\Process;
2018-10-30 08:44:51 +01:00
use SilverStripe\Core\Config\Configurable;
/**
* Invokes an immediate reindex
*
* Internally batches of records will be invoked via shell tasks in the background
*/
2015-11-21 07:19:20 +01:00
class SolrReindexImmediateHandler extends SolrReindexBase
{
2018-10-30 08:44:51 +01:00
use Configurable;
/**
* Path to the php binary
* @config
* @var null|string
*/
private static $php_bin = 'php';
2015-11-21 07:19:20 +01:00
public function triggerReindex(LoggerInterface $logger, $batchSize, $taskName, $classes = null)
{
$this->runReindex($logger, $batchSize, $taskName, $classes);
}
2015-11-21 07:19:20 +01:00
protected function processIndex(
LoggerInterface $logger,
SolrIndex $indexInstance,
$batchSize,
$taskName,
$classes = null
2015-11-21 07:19:20 +01:00
) {
parent::processIndex($logger, $indexInstance, $batchSize, $taskName, $classes);
2015-11-21 07:19:20 +01:00
// Immediate processor needs to immediately commit after each index
$indexInstance->getService()->commit();
}
2015-11-21 07:19:20 +01:00
/**
* Process a single group.
*
* Without queuedjobs, it's necessary to shell this out to a background task as this is
* very memory intensive.
*
* The sub-process will then invoke $processor->runGroup() in {@see Solr_Reindex::doReindex}
*
* @param LoggerInterface $logger
* @param SolrIndex $indexInstance Index instance
* @param array $state Variant state
* @param string $class Class to index
* @param int $groups Total groups
* @param int $group Index of group to process
* @param string $taskName Name of task script to run
*/
protected function processGroup(
LoggerInterface $logger,
SolrIndex $indexInstance,
$state,
$class,
$groups,
$group,
$taskName
2015-11-21 07:19:20 +01:00
) {
$indexClass = get_class($indexInstance);
// Build script parameters
2015-11-21 07:19:20 +01:00
$statevar = json_encode($state);
$php = Environment::getEnv('SS_PHP_BIN') ?: Config::inst()->get(static::class, 'php_bin');
// Build script line
$frameworkPath = ModuleLoader::getModule('silverstripe/framework')->getPath();
$scriptPath = sprintf("%s%scli-script.php", $frameworkPath, DIRECTORY_SEPARATOR);
2021-12-08 03:24:29 +01:00
$cmd = [
$php,
$scriptPath,
"dev/tasks/{$taskName}",
"index={$indexClass}",
2021-12-08 03:24:29 +01:00
"class={$class}",
"group={$group}",
"groups={$groups}",
"variantstate={$statevar}",
"verbose=1"
];
$logger->info('Running ' . implode(' ', $cmd));
2015-11-21 07:19:20 +01:00
// Execute script via shell
$process = new Process($cmd);
2018-10-25 01:27:49 +02:00
// Set timeout from config. Process default is 60 seconds
$process->setTimeout($this->config()->get('process_timeout'));
2018-10-25 01:27:49 +02:00
$process->inheritEnvironmentVariables();
$process->run();
$res = $process->getOutput();
2015-11-21 07:19:20 +01:00
if ($logger) {
2022-04-13 01:24:03 +02:00
$logger->info(preg_replace('/\r\n|\n/', '$0 ', $res ?? ''));
2015-11-21 07:19:20 +01:00
}
2015-11-21 07:19:20 +01:00
// If we're in dev mode, commit more often for fun and profit
if (Director::isDev()) {
Solr::service($indexClass)->commit();
2015-11-21 07:19:20 +01:00
}
2015-11-21 07:19:20 +01:00
// This will slow down things a tiny bit, but it is done so that we don't timeout to the database during a reindex
DB::query('SELECT 1');
}
}