优化并解决飞飞影视系统搜索卡顿问题

一朋友用飞飞影视系统,搭建了一个电影网站,总体流量不错,日流量有20万IP。

但是他反馈有一个问题,换了百独服务器,到晚上的时候,还是很卡很卡。

了解了一下,当前系统影片数量才6万不到,每到晚上9点左右就出现卡顿。让我帮看看是什么原因。

登陆到服务器,简单直接的top命令, 就能看到mysql数据库进程占用CPU资源300%多,

不用多想,登陆数据库直接查看是哪些SQL查询导致的问题,使用:show full processlist\G;

可以看到,都是Like 搜索电影的查询语句。类似这样的情况,是大部分系统都会遇到的,想要优化好,除去主从,查询数据加缓存等办法外,最直接的方式是去掉Like搜索,才是一劳永逸的办法。

优化全文章搜索,借助第三方工具相对比较理想,可以是Elasticsearch或Sphinx。这边直接用了Sphinx全文搜索(中文搜索coreseek已停),把软件安装好【这里百度如何安装coreseek,就不详情说明】,索引生成完后,就再调整搜索接口程序。

需要调整的程序主要有二个:

第一:Lib/Common/common.php 文件内的ff_mysql_vod函数,直接在这里做搜索处理

//当前只针对关键词搜索进行优化,其实还有几个接口需要处理

if($tag[‘wd’]){

$keyword = $tag[‘wd’];
$sphinx = new SphinxClient();
$sphinx->SetServer(‘localhost’,’9313′);
$sphinx->SetConnectTimeout(10);
$sphinx->SetLimits(0,100);

//排序方式,有改进空间,当前只是按点击量排
$sphinx->SetSortMode(SPH_SORT_ATTR_DESC, “vod_hits”);
$sphinx->SetMatchMode(SPH_MATCH_PHRASE); //全词查找
$search_result = $sphinx->query($keyword);
$total_found = (int)$search_result[‘total_found’];
$idArr = array();
if($total_found){
if(is_array($search_result[“matches”])) {
foreach ( $search_result[“matches”] as $doc => $docinfo ) {
$idArr[] = $doc;
}
}
}
$idString = implode(‘,’,$idArr);
$where[‘id_string’] = $idString;
$where[‘is_sphinx’] = 1;
$where[‘total_found’] = $total_found;
}

第二步: 把检索到的影片ID列表,传给/Lib/Lib/Model/VodViewModel.class.php 的函数 ff_select_page

//如果是全文检索,就直接调用查询到的ID

if($where[‘is_sphinx’]){
$page[‘records’] = $where[‘total_found’];
$id_string = $where[‘id_string’];
unset($where[‘total_found’]);
unset($where[‘id_string’]);
unset($where[‘is_sphinx’]);
$where[‘vod_id’] = array(‘IN’,$id_string);
}else{
$page[‘records’] = $this->ff_select_count($where);
}

通过上面二步调整,基本上就对飞飞影视系统的影片搜索优化完成啦。

当然这里还有改进的空间就是不一定要在 Lib/Common/common.php 文件内搜索,可以直接改成在 VodViewModel.class.php 文件中,只改一个地方。

但我为了更方便调整(上面已说过还有其他搜索接口可能还会需要调整)就在common.php里进行改进啦。

最后出来的效果就是这样子(因为是全文搜索,影片标题可能没有关键词,但电影介绍内有这关键词也会出来):