2014-02-26 43 views
0

嗨,即時嘗試做一個阿賈克斯實時搜索。它工作的,但我希望它快。目前我是通過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

這聽起來像您的搜索查詢是緩慢的部分。你有沒有基準測試? – MonkeyZeus

+0

超過1秒響應時間的任何事情意味着您在後端做了非常錯誤的事情,或者您有可怕的連接/託管/基礎設施。 – PeeHaa

+1

例如,您可以使用Chrome中的時間軸和網絡分析工具來查看引入這個巨大延遲的位置。如果你在同一臺機器上運行所有的東西,它應該是searchModal.php,由於某種原因它很慢。請提供代碼。 –

回答

2

你的代碼有一些問題,但沒有什麼明顯的。

一些出發點:

  • 最好的方式來找到最慢可能是檢查profiling in PHP
  • 另一件事是你使用LIKE "%x%"這將是緩慢的,如果你的用戶有很多文件(似乎不太可能,但誰知道)。檢查MySQL慢查詢日誌。
  • 你也在做一些磁盤訪問,但它不應該這麼慢 - 除非在Gallery::getNametimecheck內部發生了一些奇怪的事情。
  • 請注意,mysql擴展名已被棄用。這與速度無關,只是過時了。
+0

謝謝你的提示。爲什麼要使用磁盤? getName只是得到一個bd名字(畫廊只是一個僞文件夾),請教它做另一個查詢,但我不能騎它。我會嘗試進行分析,之前沒有聽說過這種技術。我會試着檢查請求是否及時完成,導致它花費大量時間來啓動請求(seens像它在0ms停留一段時間),也許一些apache或反病毒(localhost)的問題? – sagits

+0

如果你在本地運行整個事情,數據庫很小,等等,防病毒實際上可能會減慢連接速度。好主意。 –

0

ANSWER

.change有延遲,對於實時結果它能夠更好地使用.keyup。我CME了使用超時,使只有當用戶停止鍵入請求:

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請求的字符串,而且它的速度也很慢)。