嗨,我正在尝试进行ajax实时搜索。它工作,但我希望它快。目前我正在通过php处理html,但即使我将处理更改为js并且只从php获取数据它只能将我的搜索从2.1提高到1.8秒(这是请求时间,但需要4/5秒为了显示数据)
继承我的代码:
$("#searchfield").change(function() {
term = $(this).val();
if (searchReq != false) {
searchReq.abort();
}
searchReq = $.get("/searchModal.php", {
term : term
}).done(function(data) {
$("#liveSearch").html(data);
});
});
编辑:
php代码:
的search.php:
$files = filecontroller::search($term);
文件控制器:
public static function search($term, $by = false, $order = false) {
connection::connect();
$files = ($by && $order && validation::filesOrder($by, $order)) ? file::Search($term, $by, $order) : file::Search($term);
return $files;
}
文件模型:
public static function Search($term, $by = 'date', $order = 'DESC') {
$session_id = $_SESSION["user_id"];
$term = mysql_real_escape_string($term);
$query = mysql_query("SELECT * FROM files WHERE idUser = '$session_id' AND (name LIKE '%$term%' OR description LIKE '%$term%') ORDER BY $by $order");
$files = self::CreateFromDb($query);
return $files;
}
private static function CreateFromDb($query) {
GLOBAL $imgDir; // just get the img dir from a config file
GLOBAL $userDir; // same
$files = array();
while ($row = mysql_fetch_assoc($query)) {
$file = new File();
$file -> type = $row['type'];
$file -> idFile = $row['idFile'];
$file -> user = $row['idUser'];
$file -> gallery = $row['idGallery'];
$file -> name = htmlspecialchars($row['name']);
$file -> description = htmlspecialchars($row['description']);
$file -> date = $file -> timecheck($row['date']);
$file -> size['kb'] = $row['size'];
$file -> galleryName = Gallery::getName($file -> gallery);
$files[] = $file;
}
return $files;
}
反正有改进吗?我在当地测试。
答案 0 :(得分:2)
您的代码存在一些问题,但没有明显的问题。
一些起点:
LIKE "%x%"
如果你的用户有很多文件会很慢(似乎不太可能,但谁知道)。检查MySQL慢查询日志。Gallery::getName
或timecheck
内部发生异常。mysql
扩展程序已被弃用。这与速度无关,它只是过时了。答案 1 :(得分:0)
ANSWER
.change有延迟,实时结果更好地使用.keyup。我只是在用户停止输入时才使用超时来发出请求:
var searchTimeout;
var searchReq;
$("#searchfield").on('keyup', function() {
term = $(this).val();
if (searchTimeout) {
clearTimeout(searchTimeout);
}
if (searchReq) {
searchReq.abort();
}
searchTimeout = setTimeout(function(){
if (term.length > 2) {
searchController(term).then(function(data) {
$("#liveSearch").html(data);
});
}
else {
$("#liveSearch").html("");
}
},500);
});
function searchController(term) {
searchReq = $.ajax({
type : "GET",
url : "/searchModal.php",
data : {
term : term
},
async : true,
context : this,
beforeSend : function() {
},
complete : function() {
}
});
return searchReq;
}
与facebook和其他大型网站相比,它仍然很慢。我想快速访问它的唯一方法是使用一个很好的服务器或缓存结果(我试图只回显没有bd请求的字符串,它也很慢)。