Это основано на каком-то примере кода кэширования, который я нашел на форуме Sphinx и работает с Sphinx V2.02 и API Sphinx PHP.

Обновления, которые я сделал:

Я изменил базу данных mysql, чтобы использовать varchar для запроса, и добавил к ней индекс. Почти сразу у блоба возникли проблемы с масштабированием. Я также добавил журнал для просмотра кеша в работе. Файл журнала должен быть доступен для записи для Apache (или вашего веб-сервера) и находиться в каталоге sphinx/var/log/. В настоящее время отсутствует какая-либо очистка старых или неиспользуемых записей кэша.

В моей настройке Sphinx используется сегментированный индекс, выполняющий 20–40 запросов в секунду для примерно 50 млн документов в часы пик. Это простое кэширование на основе MySQL используется в качестве временного решения некоторых проблем с масштабированием, с которыми мы столкнулись на сайте под названием Industry Cortex, исследовательский инструмент для производственной отрасли. В настоящее время он работает довольно хорошо и может быть очень эффективным и простым решением для кэширования в правильных системах с правильными потребностями.

Как это установить:

Замените весь метод RunQueries() в PHP API Sphinx. Обновите имя пользователя и пароль для подключения к MySQL с помощью MySQLi в строке 27 ниже. Создайте базу данных mysql (моя называется `sphinx_cache`) и создайте таблицу `sphinx_cache` (то же имя, что и база данных) с кодом sql ниже. Затем создайте файл журнала и дайте вашему веб-серверу права на запись в него. Теперь у вас должен быть работающий кеш Sphinx.

Обновления API Sphinx:

function RunQueries ()
{
	if ( empty($this->_reqs) )
	{
		$this->_error = "no queries defined, issue AddQuery() first";
		return false;
	}
	// mbstring workaround
	$this->_MBPush ();
	if (!( $fp = $this->_Connect() ))
	{
		$this->_MBPop ();
		return false;
	}
	// send query, get response
	$nreqs = count( $this->_reqs );
	$req = join ( "", $this->_reqs );
	$len = 8 + strlen( $req );
	$req = pack ( "nnNNN", SEARCHD_COMMAND_SEARCH, VER_COMMAND_SEARCH, $len, 0, $nreqs ) . $req; // add header
	// === BEGIN CACHE EDITS ===
	$mysqli = new mysqli( 'localhost', 'username', 'password', 'sphinx_cache' );
	$cache_log = '/data/sphinx/var/log/cache.log';
	// check for query in mysql cache
	$cache_query_start = microtime( true );
	$results = $mysqli->query( "SELECT response FROM sphinx_cache WHERE request='" . $mysqli->real_escape_string( $req ) . "'" );
	$cache_query_end = microtime( true );
	$cache_query_time = $cache_query_end - $cache_query_start;
	if( $results->num_rows > 0 ) { // there is a cached result
		// use cached result
		$row = $results->fetch_row( );
		$response = $row[0];
		// write cache hit to log
		file_put_contents( $cache_log, "  cached query served, $cache_query_time, " . date('Y-m-d h:m:s') . ', ' . $_SERVER['PHP_SELF'] . ', ' . $_SERVER['REMOTE_ADDR'] . "\n", FILE_APPEND );
	} else { // no cached result
		// query sphinx
		$sphinx_query_start = microtime( true );
		if ( !( $this->_Send ( $fp, $req, $len+8 ) ) ||
			 !( $response = $this->_GetResponse ( $fp, VER_COMMAND_SEARCH ) ) )
		{
			$this->_MBPop ( );
			return false;
		}
		$sphinx_query_end = microtime( true );
		$sphinx_query_time = $sphinx_query_end - $sphinx_query_start;
		// store new result into mysql cache
		$mysqli->query( "INSERT INTO sphinx_cache (request, response) VALUES ('" . $mysqli->real_escape_string( $req ) . "','" . $mysqli->real_escape_string( $response ) . "')");
		// write cache miss to log
		file_put_contents( $cache_log, "* sphinx query served, $sphinx_query_time, " . date('Y-m-d h:m:s') . ', ' . $_SERVER['PHP_SELF'] . ', ' . $_SERVER['REMOTE_ADDR'] . "\n", FILE_APPEND );
	}
	// === END CACHE EDITS ===
	// query sent ok; we can reset reqs now
	$this->_reqs = array ();
	// parse and return response
	return $this->_ParseSearchResponse ( $response, $nreqs );
}

Код SQL для создания базы данных кэширования

Моя база данных называется sphinx_cache… так же, как и таблица.

CREATE TABLE `sphinx_cache` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `request` varchar(5000) NOT NULL DEFAULT '',
  `response` text NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `request` (`request`(333))
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Посмотрите Zengineering Podcast (мой подкаст)

iTunes | Андроид | Сшиватель | Ютуб | Патреон | Информационный бюллетень