Sphinx и PHP 5.3.21

Пытаюсь завести сфинкс на PHP 5.3.21, где API сфинкса уже впилено в сам PHP:
sphinx support	enabled
Version	1.1.0

Конечно, стало ругаться на то, что классы уже определены. Закомментил следующую строку в /classes/modules/sphinx/Sphinx.class.php:
require_once(Config::Get('path.root.engine').'/lib/external/Sphinx/sphinxapi.php');

Ошибки ушли, но поиск не дает результатов.

Самое странное, что подобной ситуации со встроенным в PHP сфинксапи вообще не гуглится.

Индексы создаются, но на сайте поиск выдает пустой результат. В какую сторону копать?

config.php поиска:
source site1
{
    type				= mysql
	sql_host			= localhost
	sql_user			= site1_user
	sql_pass			= 123123123
	sql_db				= site1
	sql_port			= 3306	# optional, default is 3306
	sql_query_pre		= SET CHARACTER_SET_RESULTS=cp1251
}

source elements: site1
{
    sql_query_range		= SELECT MIN(topic_id), MAX(topic_id) FROM phpbb_topics
    sql_range_step		= 1000

	sql_query = SELECT \
                    topic_id, \
                    forum_id, \
                    topic_title, \
                    topic_poster, \
                    topic_replies, \
                    topic_views, \
                    topic_last_post_id  \
                FROM \
                    phpbb_topics \
                WHERE topic_id >= $start AND topic_id <= $end

	sql_attr_uint	= topic_poster
    sql_attr_uint   = topic_replies
    sql_attr_uint   = topic_views
	sql_attr_uint	= forum_id
    sql_attr_uint	= topic_last_post_id
}

source posts: site1
{
    sql_query_pre		= SET CHARACTER_SET_RESULTS=cp1251
    sql_query_pre       = REPLACE INTO sph_counter SELECT 1, MAX(post_id) FROM phpbb_posts_text
    
    sql_query_range		= SELECT MIN(post_id), (select max_doc_id from sph_counter) FROM phpbb_posts_text
    sql_range_step		= 1000

	sql_query = SELECT \
                    pt.post_id, \
                    p.poster_id, \
                    p.post_time, \
                    t.topic_id, \
                    t.forum_id, \
                    f.cat_id, \
                    p2.post_time as last_post_in_topic_time, \
                    pt.post_text as text, \
                    t.topic_title as title \
                FROM \
                    phpbb_posts_text pt \
                INNER JOIN \
                    phpbb_posts p on p.post_id = pt.post_id \
                INNER JOIN \
                    phpbb_topics t on p.topic_id = t.topic_id \
                INNER JOIN \
                    phpbb_posts p2 on t.topic_last_post_id = p2.post_id \
                INNER JOIN \
                    phpbb_forums f on t.forum_id = f.forum_id \
                WHERE pt.post_id >= $start AND pt.post_id <= $end

    sql_attr_uint       = last_post_in_topic_time
	sql_attr_uint       = poster_id
    sql_attr_uint       = topic_id
    sql_attr_uint       = forum_id
    sql_attr_uint       = cat_id
	sql_attr_timestamp	= post_time
}

source delta: posts
{
    sql_query_pre		= SET CHARACTER_SET_RESULTS=cp1251
    sql_query_range		= SELECT (select max_doc_id from sph_counter), MAX(post_id) FROM phpbb_posts_text
}

index topics
{
    docinfo			= extern
	morphology		= stem_enru
	stopwords			=
	min_word_len		= 1
	charset_type		= sbcs
	charset_table		= 0..9, A..Z->a..z, _, a..z, U+A8->U+E5, U+B8->U+E5, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF
	min_prefix_len		= 0
	min_infix_len		= 0
    
    path			= /var/lib/sphinx/site1/topics
    source			= elements
    
    html_strip      = 1
}

index doubles: topics
{
    source          = elements
    path			= /var/lib/sphinx/site1/doubles
}

index posts: topics
{
	path			= /var/lib/sphinx/site1/posts
    source			= posts
}

index delta: posts
{
    path			= /var/lib/sphinx/site1/delta
    source			= delta
}

source site2
{
        type            = mysql
        sql_host        = localhost
        sql_user        = site2ls_user
        sql_pass        = 123123123
        sql_db          = site2ls
        sql_port        = 3306
#        sql_sock        = /var/run/mysqld/mysqld.sock
   
       
        mysql_connect_flags     = 32 
   
        sql_query_pre                   = SET NAMES utf8
        sql_query_pre                   = SET SESSION query_cache_type=OFF    
}
 
source topicsSource : site2
{
        sql_query               = \
                SELECT t_fast.topic_id, t_fast.topic_title, UNIX_TIMESTAMP(t_fast.topic_date_add) as topic_date_add, \
                tc.topic_text, t_fast.topic_publish \
                FROM prefix_topic as t_fast, prefix_topic_content AS tc \
                WHERE t_fast.topic_id=tc.topic_id AND t_fast.topic_id>=$start AND t_fast.topic_id<=$end
 
        sql_query_range         = SELECT MIN(topic_id),MAX(topic_id) FROM prefix_topic
        sql_range_step          = 1000
        sql_attr_uint = topic_publish
        sql_attr_timestamp      = topic_date_add
        sql_attr_multi  = uint tag from query; SELECT topic_id, topic_tag_id FROM prefix_topic_tag
        sql_ranged_throttle     = 0
}
 
source commentsSource : site2
{
        sql_query               = \
                        SELECT comment_id, comment_text, UNIX_TIMESTAMP(comment_date) as comment_date, comment_delete \
                        FROM prefix_comment \
                        WHERE target_type='topic' AND comment_id>=$start AND comment_id<=$end AND comment_publish=1
 
        sql_query_range         = SELECT MIN(comment_id),MAX(comment_id) FROM prefix_comment
        sql_range_step          = 5000
 
        sql_attr_uint = comment_delete
        sql_attr_timestamp      = comment_date
}
 
index topicsIndex
{
        source                  = topicsSource
        path                    = /var/lib/sphinx/site2/topicIndex
        docinfo                 = extern
        mlock                   = 0
        morphology = stem_enru
        charset_type            = utf-8
        html_strip                              = 1
        html_remove_elements = style, script, code
}
 
index commentsIndex
{
        source                  = commentsSource
        path                    = /var/lib/sphinx/site2/commentsIndex
        docinfo                 = extern
        mlock                   = 0
        morphology = stem_enru
        charset_type            = utf-8
        html_strip                              = 1
        html_remove_elements = style, script, code
}

indexer
{
    mem_limit           = 100M
}

searchd
{
    listen                  = localhost:3312
    log                     = /var/log/sphinx/searchd.log
    query_log               = /var/log/sphinx/query.log
    read_timeout            = 5
    max_children            = 30
    pid_file                = /var/run/sphinx/searchd.pid
    max_matches             = 10000
    seamless_rotate         = 1
    preopen_indexes         = 0
    unlink_old              = 1
}
 
  • avatar
  • 2
  • +1
    • 1
    • 0
    • 0

40 комментариев

avatar
проверьте на каком порту стоит сфинкс и какой порт для него прописан в конфиге LS
  • dsg
  • 0
avatar
Порт проверял. Все верно.
avatar
Угу. у вас что-то не так с конфигурацией скорее всего. Копать в /config/modules/search/config.php
avatar
Все дефолтно:
$config['entity_prefix']  = '';
$config['sphinx']['host'] = 'localhost';
$config['sphinx']['port'] = '3312';

Сфинкс работает по порту 3312.
avatar
Может быть дело в пустом entity_prefix?
avatar
А что там должно быть? Пробовал разное — результата ноль.
В первый пост добавил конфиг сфинкса.
avatar
searchd запущен?
avatar
Сфинкс работает еще для одного сайта — там все работает.
avatar
К слову, сайт, который работает кроме лайвстрита, на cp1251. Хотя не думаю, что это может мешать, т.к. в конфиге сфинкса везде прописано utf8 (из дефолтного конфига, взятого из дистрибутива LS). Да и слова на латинице тоже не ищет.
avatar
Выкладывайте sphinx.conf тогда тоже. пока не понятно ничего.
avatar
В топик добавил конфиг сфинкса. Обслуживается два сайта. Второй LiveStreet.
avatar
sphinx.conf нормальный. и /config/modules/search/config.php соответствует. entity_prefix в этом случае и должен быть пустой строкой. Загадочно как-то. Я бы сказал с конфигурацией у вас все в порядке. Ройте во всевозможных логах, может найдется подсказка какая-то.
avatar
Глянул в логи запросов. Там вообще отсутствуют запросы с этого сайта. Так должно быть? Если нет, то где копать? Движок чистый. Только админка установлена. Никаких правок кода не проводилось.
avatar
такая же ерунда — поставил на сервер nginx+php-fpm+fast-cgi и сфинкс умолк. Все работает, индексы создаются верно, все порты работают (даже через сокет пробовал), но сайте пустота — ничего не выдает и в логи запросов ничего не пишет и в логе searchd тоже пусто
  • dsg
  • 0
avatar
проверьте через консоль как ищет с созданными индексами: sphinxsearch.com/docs/1.10/ref-search.html

Наличие индексных файлов ещё не означает что с ними всё в порядке.
avatar
ой, а можете пример команды в консоли написать, а то с английским совсем плохо)
avatar
search --config /etc/sphinx/sphinx.conf world
avatar
справился. Ищет, выдает все верно из консоли, а вот в LS не выдает
avatar
Ну опять же — выкладывайте свой /config/modules/search/config.php & sphinx.conf. Может увидим чего.
avatar
## Конфигурационный файл Sphinx-а для индексации Живой улицы

#######################
#
# Описываем индексы
#
#######################

# Источник-родитель для всех остальных источников. Здесь указываются параметры доступа 
# к базе данных сайта
source lsParentSource
{
        type            = mysql
        sql_host        = localhost
        sql_user        = user
        sql_pass        = pass
        sql_db          = name
        sql_port        = 3306
        # Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы 
        # операции с БД происходили не через TCP/IP стек сервера)
        sql_sock        = /var/run/mysqld/mysqld.sock
    
        
        mysql_connect_flags     = 32 # 32- включение сжатие при обмене данными с БД
    
        # Включам нужную кодировку соединения и выключаем кеш запросов
        sql_query_pre                   = SET NAMES utf8
        sql_query_pre                   = SET SESSION query_cache_type=OFF    
}

# Источник топиков
source topicsSource : lsParentSource
{
        # запрос на получения данных топиков
        sql_query               = \
                SELECT t_fast.topic_id, t_fast.topic_title, UNIX_TIMESTAMP(t_fast.topic_date_add) as topic_date_add, \
                tc.topic_text, t_fast.topic_publish \
                FROM prefix_topic as t_fast, prefix_topic_content AS tc \
                WHERE t_fast.topic_id=tc.topic_id AND t_fast.topic_id>=$start AND t_fast.topic_id<=$end

        # запрос для дробления получения топиков на неколько итераций
        sql_query_range         = SELECT MIN(topic_id),MAX(topic_id) FROM prefix_topic
        
        # сколько получать объектов за итерацию
        sql_range_step          = 1000

        
        # Указываем булевый атрибут критерия "топик опубликован". Для возможности указания этого критерия при поиске
        sql_attr_bool           = topic_publish

        # Атрибут даты добавления, типа "время"
        sql_attr_timestamp      = topic_date_add

        # мульти-аттрибут "теги топика"
        sql_attr_multi  = uint tag from query; SELECT topic_id, topic_tag_id FROM prefix_topic_tag

        sql_ranged_throttle     = 0
}

# Источник комментариев
source commentsSource : lsParentSource
{
        sql_query               = \
                        SELECT comment_id, comment_text, UNIX_TIMESTAMP(comment_date) as comment_date, comment_delete \
                        FROM prefix_comment \
                        WHERE target_type='topic' AND comment_id>=$start AND comment_id<=$end

        sql_query_range         = SELECT MIN(comment_id),MAX(comment_id) FROM prefix_comment
        sql_range_step          = 5000

        sql_attr_bool           = comment_delete
        sql_attr_timestamp      = comment_date
}

# Источник компаний
source companiesSource : lsParentSource
{
        sql_query               = \
                        SELECT company_id, company_name, company_name_legal, company_description, UNIX_TIMESTAMP(company_date_add) as company_date_add, company_active, company_city \
                        FROM prefix_company \
                       WHERE company_id>=$start AND company_id<=$end

        sql_query_range         = SELECT MIN(company_id),MAX(company_id) FROM prefix_company
        sql_range_step          = 1000

        sql_attr_uint = company_active
        sql_attr_timestamp      = company_date_add
		sql_ranged_throttle     = 0
}

#######################
#
# Описываем индексы
#
#######################

index topicsIndex
{
        # Источник, который будет хранить данный индекса
        source                  = topicsSource
        path                    = /usr/local/SphinxIndex/topicsSource/

        # Тип хранения аттрибутов
        docinfo                 = extern

        mlock                   = 0

        # Используемые морфологические движки
        morphology              = stem_enru, soundex, metaphone

        # Кодировака данных из источника        
        charset_type            = utf-8


        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
}

# Индекс комментариев
index commentsIndex
{
        source                  = commentsSource
        path                    = /usr/local/SphinxIndex/commentsSource/

        docinfo                 = extern

        mlock                   = 0

        morphology              = stem_enru, soundex, metaphone

        charset_type            = utf-8
}

# Индекс компаний
index companiesIndex
{
        source                  = companiesSource
        path                    = /usr/local/SphinxIndex/companiesSource/

        docinfo                 = extern

        mlock                   = 0

        morphology = stem_enru

        charset_type            = utf-8
        
        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
        html_remove_elements = style, script, code
}

#######################
#
# Настройки индексатора
#
#######################


indexer
{
        # Лимит памяти, который может использавать демон-индексатор
        mem_limit                       = 128M
}

#######################
#
# Настройка демона-поисковика
#
#######################

searchd
{
        # Адрес, на котором будет прослушиваться порт
        listen                         = localhost:9312


        # Лог-файл демона
        log                                     = /var/log/sphinxsearch/searchd.log

        # Лог поисковых запросов. Если закомментировать,то логировать поисковые строки не будет
        query_log                       = /var/log/sphinxsearch/query.log

        # Время в секундах, которое ждет демон при обмене данными с клиентом. По исчерпании происходит разрыв коннекта
        read_timeout            = 5
        client_timeout   = 300
        # Максимальное количество одновременно-обрабатываемых запросов. 0 означает дофига, а точнее без ограничения
        max_children            = 100

        # Файл, в который сохраняется PID-процесса при запуске
        pid_file                        = /var/run/searchd.pid
       workers	= threads
       compat_sphinxql_magics = 0
     
}


/**
 * Конфиг модуля "search"
 */
$config['entity_prefix']  = '';
$config['sphinx']['host'] = 'localhost';
$config['sphinx']['port'] = '9312';

return $config;

Ровно с этими конфигами все работало раньше, т.е. они 100% рабочие, но вот почему LS не получает результата поиска — вопрос.
avatar
netstat -lnp

Сфинкс слушает 9312 порт там?
Для порта вроде как есть отдельная директива port в секции searchd.
Правда не помню с какой версии.
avatar
ввел команду, searchd действительно слушает 9312

У меня стоит сейчас 2.0.6, но точно помню, что в 0.8.х, который раньше как-то ставил, я убирал директиву порт, т.к. с ней не работало. Ее снова вернули в обиход?
avatar
не, отдельно port=9312 не помогло
avatar
Я могу только предполагать… конфиги, вроде бы, правильные и сам по себе Sphinx работает. Значит причина в другом. Вы уверены что в логах системного уровня ничего нет? должно что-то где-то быть.
avatar
точно пусто. В логах сфинкса данные о успешном запуске/перезапуске. В лог запросов ничего не записывается. Лог ошибок nginx полон таких записей:
2013/03/25 18:56:39 [warn] 1893#0: *1340 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000016, client: 89.109.46.164, server: ХХ.ХХ.ХХ.ХХХ, request: "POST /manager/ispmgr HTTP/1.1", host: "ХХ.ХХ.ХХ.ХХХ", referrer: "https://ХХ.ХХ.ХХ.ХХХ/manager/ispmgr?func=file.edit&elid=sphinx.conf&plid=etc%2Fsphinxsearch&operafake=911"

и я понимаю, что это про сфинкс, но ни при поиске ни при перезапуске демона такая строка не появляется и откуда она берется никак не пойму.

Меня, в этой связи, сильно смущает — конфиг nginx. Он поставился сам и я его подкорректировал в сторону работы с php5-fpm, но у меня нет директивы site-aviable или site-enable, т.е. все сразу в nginx.config прописалось. Может он глючный (я половину дефолтных команд не очень понимаю) и перенаправляет куда-нибудь? Посмотрите, пожалуйста:

user www-data;worker_processes  1;

timer_resolution 100ms;
worker_rlimit_nofile 8192;
worker_priority -5; #Увеличитваем приоритет

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # Включаем сжатие
gzip  on;
#Степень сжатия (рекомендую 4-5, больше смысла не имеет нагрузка на ЦПУ растет, а файлы не значительно уменьшаются)
gzip_comp_level     5; 
# Разрешаем выдавать в ответе строку заголовка "Vary: Accept-Encoding" (Google Page Speed будет доволен)
gzip_vary on;
# Запрещаем проверку наличие готового сжатого файла. (в правилах разрешаем только там где нужно, если везде проверять дополнительные действия будут в системе делаться чтобы проверить существование таких файлов)
gzip_static off;
# Типы файлов которые мы будем сжимать
gzip_types text/css text/plain application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
# Указываем минимальную длина ответа, при которой модуль будет сжимать, в байтах (сжимаем файлы больше киллобайта, меньше смысла не имеет слабо ощутимо сжатие будет)
gzip_min_length  1024;
# Запрещаем сжатие ответа методом gzip для IE4-6 (можно записать регулярным выражением, но по словам автора nginx так быстрее будет работать)
gzip_disable     "msie6";
# Разрешить сжатие для всех проксированных запросов 
gzip_proxied     any;


    include /etc/nginx/conf.d/*.conf;
	include /usr/local/ispmgr/etc/nginx.domain;
	client_max_body_size 16M;
	log_format isp '$bytes_sent $request_length';
	server {
		server_name site.ru www.site.ru;
		listen XX.XX.XX.XXX;
                server_tokens off;
		disable_symlinks if_not_owner from=$root_path/$subdomain;
                index index.php;
		set $root_path /var/www/site/data/www/site.ru;
                root /var/www/site/data/www/site.ru;
    
		set $subdomain "";
		if ($host ~* ^((.*).site.ru)$) {
			set $subdomain $2;
		}        
               
                               
		location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
			root $root_path/$subdomain;
			access_log /var/www/nginx-logs/site isp;
			error_page 404 = @fallback;
            
          
               
		}
		location / {
			proxy_pass http://XX.XX.XX.XXX:81;
			proxy_redirect http://XX.XX.XX.XXX:81/ /;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Real-IP $remote_addr;
                        try_files $uri $uri/ /index.php?q=$uri&$args;
                  
		}
                location /templates/cache/synio/ {
	                gzip_static on;
                }
                location ~ \.php {
                       fastcgi_pass  unix:/tmp/fastcgi.socket;
                       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                       include fastcgi_params;
                }

                location ~ \.(tpl|xml|log)$ {
                       deny all;
                }  
                location /uploads/ {
		       location ~ .*\.(php)?$
		       {
			    deny all;
		        }
	        }  
                 location /bannerbank/banner/ {
		       location ~ .*\.(php)?$
		       {
			    deny all;
		        }
	        }            
		location ~* ^/(webstat|awstats|webmail|myadmin|pgadmin)/ {
			proxy_pass http://XX.XX.XX.XXX:81;
			proxy_redirect http://XX.XX.XX.XXX:81/ /;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Real-IP $remote_addr;
		}
                
		location @fallback {
			proxy_pass http://XX.XX.XX.XXX:81;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Real-IP $remote_addr;
		} 
               
                
		include /usr/local/ispmgr/etc/nginx.inc;
               
	}
avatar
Думаю стоит покрутить client_body_buffer_size в энжиниксе.
avatar
в какую сторону? или может вообще его убрать?
avatar
Поставить повыше.
avatar
поставил 32М, ничего не изменилось)
avatar
а ошибка в логах nginx (которую выше указал) появляется при его перезапуске
avatar
снес все, что было: nginx, fast-cgi, php5-fpm, эффекта 0, все равно на сайте поиск ничего не выводит
avatar
А вы не знаете, это может быть как-то связано с правами, от которых LS слушает порт 9312?

Я уже просто не знаю, что еще посмотреть. У меня сейчас стоит чистый debian 6 с апачем, поиск через консоль так же работает, но сайт ничего не выводит…
avatar
Но вы же говорили что пробовали настроить sphinx через сокет c тем же эффектом. дело не в этом.
avatar
одну проблему нашел: cron тоже перестал запускаться и при запуске файла notify.php через консоль вижу, что ругается на файл /plugins/aceadminpanel/config/config.localhost.php — Undefaned index: SERVER NAME
Копаю дальше)
avatar
может попробуйте выключить все плагины?
avatar
пробовал, крон заработал, сфинкс нет. В общем, сношу всю систему и переустанавливаю по новой. Спасибо за Ваши топики, очень пригождаются)
avatar
Да, тяжелый случай. Сейчас тоже мучаюсь со свинксом вот здесь livestreet.ru/blog/questions/14784.html
Кто нибудь может точно сказать что должно быть в правой части
/**
* Конфиг модуля «search»
*/
$config['entity_prefix'] = '';

Я где то здесь на этом сайте видел такое
$config['entity_prefix']  = 'БД';
avatar
Попробуй посмотри сначала здесь livestreet.ru/blog/dev_documentation/13482.html
а особенно здесь livestreet.ru/blog/questions/11067.html Я сделал как по второй ссылке, на двух сайтах все отлично работает.
avatar
Решение проблемы было найдено в результате дискуссий в этом топике. Конкретно у меня в конфиге сфинкса стоит:
max_matches = 10000

Следовательно, решением проблемы была замена 72-й строки файла Sphinx.class.php
$this->oSphinx->SetLimits($iOffset, $iLimit);

на
$this->oSphinx->SetLimits($iOffset, $iLimit, 10000);

Решение, конечно, не ахти, но во всяком случае работает. Может кому-то эта информация будет полезна. Будем надеяться, что в следующем обновлении Livestreet подобной проблемы не будет.
  • Mac
  • 0
avatar
То же самое… Оказалось что опечатался в
$config['entity_prefix']  = '';
ЛОЛ
  • 777
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.