Comencé mi viaje para acelerar el autocompletado de jQuery esta tarde, y decidí que probablemente era una buena idea comenzar memcaching todo. Como se sugiere en este artículo: Speeding up autocomplete.Acelerando jQuery AutoComplete (listas innecesariamente largas)
Sin embargo, todavía estoy lidiando con un tiempo de respuesta lento incluso después de instalar y usar Memcached.
El problema en mi caso es que estoy tratando con listas extraordinariamente largos, en mi caso, sobre miembros individuales. (Todos los géneros o géneros de todas las plantas)
El cuello de botella parece estar construyendo la tabla y rellenando la lista del lado del cliente, y no es causada al recuperar la información de Memcached.
Si alguien más se ha encontrado con este problema en particular, me gustaría saber de una forma inteligente de resolverlo. Voy a publicar mi código a continuación.
Nota: Esta página en particular no está disponible para el público en general, y soy consciente de que hay algunos agujeros de seguridad muy abiertos.
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" />
No sé si esto lo aceleraría en absoluto, pero debería poder establecer '$ Genera = $ result' en lugar de hacer la segunda llamada a la Memcache. O mejor aún, solo use '$ result' en su' foreach() 'en vez de' $ Genera' – jprofitt
¿Puede usar una solicitud de Ajax para llenar los datos después de que la página se cargue o antes de que el usuario intente usar el autocompletado? – jmort253
Parece que está emulando creando una notación json de una matriz. Probablemente 'json_encode' te dará una mejor velocidad que el foreach. Sin embargo, primero debe averiguar qué parte de ese fragmento de código consume tanto tiempo. Localice el cuello de botella primero ejecutando algunas métricas. – hakre