2012-12-20 4 views
3

J'ai écrit une application Web de base en PHP et MySQL qui utilise des chaînes de requête pour rechercher diverses informations. Par exemple: xxxxxxx.com/?profile=1245Quel est le moyen le plus efficace de rechercher un nom de compte dans MySQL en utilisant PHP?

Très basique, premier développeur de type application web.

Je veux créer différents comptes qui auront chacun leurs propres ensembles de données. Je veux différencier ces comptes en utilisant des sous-domaines. Par exemple: username.xxxxxxxx.com?profile=4527

J'ai un catchall mis en place dans ma config Apache pour renvoyer tous les sous-domaines à mon domaine principal et je peux tirer ce sous-domaine en utilisant php comme ceci:

<?php list($username) = explode(".", $_SERVER[ "HTTP_HOST" ]); ?>

maintenant , Il est ma question:

Il me semble (je suis assez nouveau à tout cela) que l'exécution d'une recherche par chaîne pour chaque requête que je dois faire sur chaque page va être lente et inefficace. Par exemple, avoir à chercher SELECT * WHERE username = sampleuser AND profile = 2745

Mais est-ce vrai? Quel serait le moyen le plus efficace? Comment les applications Web qui utilisent des sous-domaines traitent-elles normalement ce genre de chose?

Merci beaucoup à l'avance.

+0

Eh bien, vous pourriez ajouter un index sur 'username' à votre table ... – paddy

+0

Merci paddy. Je le ferai à coup sûr. Mais même après cela, cela restera-t-il rapide s'il y a 1000 lignes ou plus (en jetant juste un grand nombre)? Tout ce que j'ai fait jusqu'ici a été sur des tables avec 50 lignes ou moins, donc l'efficacité n'était pas aussi importante. –

+0

Est-ce que quelque chose est partagé entre ces sous-domaines en termes de données utilisateur? – gview

Répondre

0

"Comment les applications Web qui utilisent des sous-domaines traitent-elles normalement ce genre de chose?"

Habituellement, chaque sous-domaine est mappé dans le moteur Web (apache/IIS) en utilisant quelque chose comme un module de réécriture, à une adresse IP spécifique ou à une racine spécifique. Donc blog. * Sous-domaine pourrait pointer vers la racine de l'application WordPress.

Dans votre cas, cela semble ne pas s'appliquer à moins d'avoir un ensemble de pages différent pour chaque utilisateur. C'est à dire. Si elles ont toutes une page "Détails du compte" et que seules les données sont différentes, le seul endroit où le sous-domaine entrerait en jeu est celui des requêtes ou des URL que vous générez.

Dans votre cas, vous disposez de routes conceptuellement dynamiques. En général, vous ne faites qu'interroger une table pour déterminer le contenu à diffuser. Dans votre cas, ce n'est pas tant le contenu que les données. Parfois, les routes sont mises en cache globalement en mémoire à l'aide d'une structure de données bien organisée pour les recherches, dans vos recherches de cas via le nom d'utilisateur qui vous renvoie la clé primaire de la table des utilisateurs. Ensuite, sans interroger la table de l'utilisateur, vous avez vos critères de filtre pour les données qui référencent cet utilisateur via une clé étrangère. Donc, si vous naviguez jusqu'à la page "J'aime", vous pouvez "Sélectionner * De Likes Where UserKey = $ userKeyFromLookup". Vous voudriez choisir une structure de données en mémoire pour les recherches qui permettent les recherches O (1). C'est à dire. recherches à temps constant.

Il me semble (je suis assez nouveau à tout cela) que vous effectuez une recherche sur la base de la chaîne pour chaque requête que je dois faire sur chaque page est va être lent et inefficace. Par exemple, avoir à rechercher SELECT * OÙ username = exempleutilisateur ET profil = 2745

Est profil ID unique à chaque utilisateur? Si c'est le cas, vous n'avez pas besoin de nom d'utilisateur dans la requête. L'identifiant de profil seul vous donnera une réponse unique. Si quelqu'un visite le nom d'utilisateur. . sans ID de profil, la première chose à faire est de récupérer l'identifiant profileID puis de rediriger vers la même page mais maintenant avec ce paramètre dans l'URL afin que toute autre navigation soit effectuée dans le contexte de ce profileID. Je suis d'accord avec Stony, je pense que vous trouverez des quarks avec des sous-domaines dynamiques. Je mettrais le nom d'utilisateur dans l'URL à la place.

+0

Correct ... mais il y a beaucoup plus à faire lorsque vous voulez changer votre fichier vhost. Et un script qui édite votre fichier vhost peut être un problème de sécurité. – Stony

3

L'utilisation d'un sous-domaine n'est pas très efficace. Quand vous jetez un oeil à SEO. Vous avez de nombreux domaines et sites qui ont le même contenu.

je préférerais une ré-écriture dans votre cas

www.xxxxx.com/username 

alors vous pouvez réécrire le nom d'utilisateur à votre script. Le problème est que cela peut être un problème lorsque vous créez un nouveau sous-domaine pour chaque utilisateur. C'est possible, qu'un utilisateur ait mis en cache la requête DNS et que cela prenne beaucoup de temps pour accéder au site.

La seconde est que vous devriez interroger la base de données aussi peu que possible. Enregistrez le nom d'utilisateur ou l'ID dans la session.

$_SESSION['username'] = 'username'; 

Ensuite, vous pouvez faire la requête pour obtenir les informations de votre base de données.

Edit: Lorsque vous avez besoin plus de performance, vous devriez jeter un oeil à MongoDB ou utilisez Memcache pour stocker les choses/cache.

+0

J'allais suggérer de mettre en cache le nom d'utilisateur dans la session à (probablement dans le cadre de l'authentification), mais je suppose que dans son cas ce sont des pages que les autres utilisateurs navigueraient. Je devine une sorte de site social. Donc, l'utilisateur Bob pourrait être en train de parcourir someOtherUser.blah.com, il aurait besoin de chercher someOtherUser, pas Bob, parce que Bob est dans le cache de la session, et non dans someOtherUser. – AaronLS

+0

C'est correct. Mais vous pouvez créer une variable par exemple 'aktUsername' ou 'profileUsername'. Mais dans votre cas, ce n'est pas un problème, vous pouvez l'analyser une fois en haut. Mais un sous-domaine pour chaque utilisateur n'est pas vraiment une bonne idée – Stony

+0

Correct, AaronLS. Seul l'utilisateur Bob serait capable d'éditer bob.blah.com mais le monde entier pourrait voir bob.blah.com. Une comparaison facile qui vient à l'esprit est Tumblr. Si vous créez un compte là-bas, vous pouvez créer un contenu que tout est posté sur yourname.tumblr.com Vous seul pouvez poster des choses, mais tout le monde peut les voir. –

Questions connexes