我在我的服务器上使用 Yii2-advanced 与 sphinx 并且工作正常,但在客户端服务器上部署网站后,当我尝试获取查询结果时出现Exception 。两台服务器都有php5.6版本。
Sphinx配置:
Link
PHP代码:
source investmo_index
{
type = mysql
sql_host = localhost
sql_user = user
sql_pass = password
sql_db = database
sql_port = 9306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET CHARACTER SET utf8
sql_query = \
SELECT \
id, \
title, \
slug, \
header, \
content ,\
created_at \
FROM page \
WHERE is_active='1';
sql_field_string = title
sql_field_string = slug
sql_field_string = header
sql_field_string = content
sql_attr_timestamp = created_at
sql_ranged_throttle = 0
}
index investmo_index
{
source = investmo_index
path = /var/www/sphinx/investmo_index
docinfo = extern
mlock = 0
morphology = stem_enru
min_word_len = 1
html_strip = 1
index_exact_words = 1
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
min_infix_len = 1
}
searchd
{
listen = 127.0.0.1:9312
listen = 9306:mysql41
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 = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /var/lib/sphinx
}
$ command-> sql在两台服务器上都能正常运行
namespace frontend\controllers;
use Yii;
use yii\sphinx\Query;
use yii\data\ActiveDataProvider;
use common\models\Page;
class SearchController extends \yii\web\Controller
{
public function actionIndex()
{
$searchPhrase = Yii::$app->request->get('search');
$order = Yii::$app->request->post('order', false);
$provider = false;
$answers = false;
$count = false;
if (!empty($searchPhrase)) {
$query = new Query;
$query = $query
->select([
'*',
'SNIPPET(title, \''.$searchPhrase.'\', \'before_match=<mark>\', \'after_match=</mark>\') AS _title',
'SNIPPET(header, \''.$searchPhrase.'\', \'before_match=<mark>\', \'after_match=</mark>\') AS _header',
'SNIPPET(content, \''.$searchPhrase.'\', \'before_match=<mark>\', \'after_match=</mark>\') AS _content'
])
->from('investmo_index')
->match($searchPhrase)
->snippetOptions(['before_match' => '<mark>', 'after_match' => '</mark>']);
if ($order == 'date') {
$query = $query->orderBy(['created_at' => SORT_DESC]);
} else if ($order == 'title') {
$query = $query->orderBy(['title' => SORT_ASC]);
}
// HERE I GET AN ERROR
$command = $query->createCommand();
// var_dump($command->sql);
var_dump($command->queryAll());
exit;
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
'route' => '/search/search/',
]
]);
$count = $query->count();
$answers = $provider->getModels();
}
return $this->render('index', [
'phrase' => $searchPhrase,
'answers' => $answers,
'provider' => $provider,
'count' => $count,
]);
}
$ command-&gt; queryAll()在我的服务器上正常工作,但在客户端服务器上它会抛出数据库异常
'SELECT *, SNIPPET(title, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _title, SNIPPET(header, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _header, SNIPPET(content, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _content FROM `investmo_index` WHERE MATCH(:qp0)'
有什么不对?
问题解决了。感谢@barryhunter,就像他说问题是 sphinx版本。