2009-09-29 5 views
0

Mon programme de recherche AJAX ne cesse de demander à PHP les résultats d'un terme de recherche particulier. Le début du script PHP se lit à travers une base de données MySQL et s'initialise, donc si le PHP continue à redémarrer, il devra lire la base de données des millions de fois. Si je peux le garder en vie et laisser plusieurs requêtes AJAX stupides être servies par une seule instance de script PHP en cours d'exécution, je suis sûr que les performances s'amélioreraient.Comment gérez-vous plusieurs requêtes AJAX en PHP?

Comment faites-vous cela typiquement? Utiliser un service? Cela peut-il être fait avec des services?

+0

est-ce pour un système de marquage? Pas moyen d'analyser une fois le texte pour les mots-clés et les mots-clés trouvés transformés en lien une fois pour toutes? Peut-être expliquer ce que vous avez l'intention de faire exactement. – pixeline

+0

Fondamentalement, j'ai un script PHP que la requête AJAX est censée interroger. Je ne suis pas sûr de savoir comment je vais faire la partie AJAX mais j'essaie de comprendre le côté PHP en premier. –

Répondre

1

Que diriez-vous de stocker les résultats db dans une variable de session? Vous vérifiez d'abord si le mot-clé n'est pas dans la session (les sessions permettent de transporter des valeurs de variables entre les actualisations de page), et si ce n'est pas le cas, faites une requête db.

Pour stocker:

$_SESSION['storedQueries']['keyword']= 'its definition, from the database'; 

Pour chercher:

$index= array_search('keyword',array_keys($_SESSION['storedQueries'])); 
    $result = ($index) ? $_SESSION['storedQueries'][$index] : 'nothing found, you should do a db query'; 

La partie ajax est assez facile si vous utilisez une bibliothèque javascript, comme jquery:

$('#resultZone').load('find.php',{keyword: $('input.search').val() }); 
+0

Les variables de session sont-elles envoyées sur HTTP? –

+0

du document: "Un visiteur qui accède à votre site Web se voit attribuer un identifiant unique, l'identifiant de session, qui est soit stocké dans un cookie du côté de l'utilisateur, soit propagé dans l'URL." – pixeline

2

PHP n'a aucun concept d'objets de longue durée ou d'état partagé entre threads ou requêtes, chaque requête commence toujours à zéro (exception t pour l'état de la session, bien sûr). Vous pouvez émuler des objets de longue durée en les mettant en mémoire cache sur le disque ou la mémoire (voir memcached).

Avez-vous une raison particulière de lire toute la base de données lors de l'initialisation de votre script?

1

Si le résultat de la recherche est similaire à plusieurs utilisateurs, je crée généralement un fichier cache et sérialise le jeu de résultats. En tant que nom de fichier, je pourrais utiliser md5sum d'une chaîne contenant la requête de recherche et peut-être un groupe d'utilisateurs. Ensuite, quand un Ajax a besoin des données j'ai juste besoin de vérifier si le fichier est trop vieux, sinon j'ai juste besoin de l'envoyer au client ou peut-être même simplement rediriger la requête Ajax http vers le fichier (en supposant qu'il est correctement formaté) . Si le fichier est trop ancien, je l'actualise simplement avec un nouveau contenu.

Pour les sites à volume très élevé, memcached est généralement une meilleure option. De plus, une sorte de cache PHP aide et le regroupement de connexions SQL réduit la surcharge de l'ouverture des connexions SQL.

0

la connexion à la base de données est une opération très coûteuse et vous pouvez contourner cela en mettant en cache les résultats, jetez un oeil à Zend_Cache et voir comment il peut vous sauver allouer des maux de tête.

Questions connexes