Tôi bắt đầu cuộc hành trình của mình để tăng tốc độ tự động hoàn thành của jQuery vào đầu giờ chiều này và quyết định là bắt đầu memcaching mọi thứ. Như được đề xuất trong bài viết này: Speeding up autocomplete.Tăng tốc jQuery AutoComplete (danh sách dài không thể tránh khỏi)
Tuy nhiên, tôi vẫn đang xử lý thời gian phản hồi chậm ngay cả sau khi cài đặt và sử dụng Ghi nhớ.
Vấn đề trong trường hợp của tôi là tôi đang xử lý danh sách dài đột xuất, trong trường hợp của tôi, trên thành viên riêng lẻ. (Tất cả các chi hoặc các cây thuộc tất cả các cây)
Nút cổ chai dường như đang xây dựng bảng và điền vào danh sách phía máy khách và không gây ra bởi việc truy xuất thông tin từ Memcached.
Nếu bất kỳ ai khác đã gặp sự cố cụ thể này, tôi rất thích nghe một cách thông minh để giải quyết vấn đề đó. Tôi sẽ đăng mã của tôi dưới đây.
Lưu ý: Trang cụ thể này không khả dụng cho công chúng và tôi biết rằng có một số lỗ hổng bảo mật định hình.
require_once 'oo/Database.php';
$mysqldb = new Database;
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect to memcache");
$sql = "SELECT DISTINCT `Genus` FROM importlist.plants";
$key = md5('query'.$sql);
$result = $memcache->get($key);
//check if we got something back
if($result == null) {
//fetch from database
$result = $mysqldb->rawSelect($sql)->getResult();
//set to memcache, expires after 1 hour
$memcache->set($key,$result,0,3600);
}
//Result array
$Genera = ($memcache->get($key));
//Add required "quotation marks" for autocomplete
foreach ($Genera as &$Genus){
$Genus = '"'.$Genus[Genus].'"';
}
$Genera = implode($Genera,',');
//PHP to generate jQuery
echo <<< EOT
<script>
$(function() {
var availableTags = [$Genera];
$("#tags").autocomplete({
source: availableTags
});
});
</script>
EOT;
?>
<input id="tags" />
Không biết rằng điều này có thể tăng tốc chút nào, nhưng bạn có thể đặt '$ Genera = $ result' thay vì thực hiện cuộc gọi thứ hai tới memcache. Hoặc tốt hơn, chỉ cần sử dụng '$ result' trong' foreach() 'chứ không phải' $ Genera' – jprofitt
Bạn có thể sử dụng yêu cầu ajax để điền dữ liệu sau khi tải trang hoặc trước khi người dùng cố gắng sử dụng tự động hoàn thành? – jmort253
Dường như bạn đang mô phỏng tạo một ký hiệu json của một mảng. Có lẽ 'json_encode' sẽ cho bạn tốc độ tốt hơn so với foreach. Tuy nhiên, trước tiên bạn nên tìm ra phần nào của đoạn mã đó tiêu thụ quá nhiều thời gian. Xác định vị trí nút cổ chai đầu tiên bằng cách chạy một số chỉ số. – hakre