Это основано на каком-то примере кода кэширования, который я нашел на форуме 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 | Андроид | Сшиватель | Ютуб | Патреон | Информационный бюллетень