我在php和MySQL中编写了一个基本的Web应用程序,它使用查询字符串来查找各种信息。例如:xxxxxxx.com/?profile=1245
非常基本的首次开发者类型的网络应用。
我想创建不同的帐户,每个帐户都有自己的数据集。我想通过使用子域来区分这些帐户。例如:username.xxxxxxxx.com?profile=4527
我在我的Apache配置中设置了一个catchall来将所有子域转移到我的主域,然后我可以使用php将该子域拉出来:
<?php list( $username ) = explode( ".", $_SERVER[ "HTTP_HOST" ] ); ?>
现在,这是我的问题:
在我看来(我对所有这些都相当新),对每个页面执行基于字符串的搜索我需要在每个页面上进行,这将是缓慢且低效的。例如,必须查找SELECT * WHERE username = sampleuser AND profile = 2745
但这是真的吗?什么是最有效的方式?使用子域的Web应用程序通常如何处理这类事情?
提前谢谢你们。
答案 0 :(得分:3)
使用子域名效率不高。当你看看SEO。您有许多具有相同内容的域和网站。
我希望在你的情况下重写
www.xxxxx.com/username
然后你可以重写脚本的用户名。问题是,当您为每个用户创建新的子域时,它可能是一个问题。可能的是,用户缓存了DNS请求,并且需要花费大量时间来访问该站点。
第二个是你应该尽可能少地查询数据库。在会话中保存用户名或ID。
$_SESSION['username'] = 'username';
然后,您可以进行查询以从数据库中获取信息。
修改:当您需要更高的性能时,您应该查看 MongoDB 或使用 Memcache 来存储/缓存内容。
答案 1 :(得分:0)
“使用子域名的网络应用程序通常如何处理这类事情?”
通常,每个子域都使用重写模块,特定IP地址或特定根等映射到Web引擎(apache / IIS)中。所以blog。* subdomain可能指向WordPress应用程序的根目录。
在您的情况下,除非您为每个用户设置了不同的页面,否则听起来不会适用。即如果它们都有“帐户详细信息”页面,并且只有数据不同,那么子域唯一可以使用的是查询或您生成的URL。
在您的情况下,您拥有概念上动态的路线。通常,您只需查询表以确定要提供的内容。在你的情况下,它不仅仅是数据的内容。有时,路由使用为查找组织良好的数据结构在内存中全局缓存,在您的情况下通过用户名查找,返回用户表的主键。然后,在不查询用户表的情况下,您可以获得通过外键引用该用户的数据的过滤条件。因此,如果导航到“喜欢”页面,您可以“选择*来自Likes Where UserKey = $ userKeyFromLookup”。您可能希望为允许O(1)查找的查找选择内存数据结构。即恒定时间查找。
在我看来(我对所有这些都相当新)表现得很好 基于字符串的搜索我需要在每个页面上执行的每个查询 会变得缓慢而低效。例如,不得不抬头 SELECT * WHERE username = sampleuser AND profile = 2745
每个用户的个人资料ID是否唯一?如果是这样,那么您在查询中不需要用户名。只有配置文件ID会给您一个独特的响应。如果有人访问了没有配置文件ID的用户名。。,那么您首先要抓住profileID,然后重定向到同一页面,但现在在URL中使用该参数,以便所有其他导航都在该profileID的上下文。
我同意Stony,但我认为你会发现有动态子域的夸克。我会将用户名放在URL中。