在每页检查时,使用会话还是数据库查询?

4

我有一个应用程序需要检查用户表中的多个数据,以便创建页面。

不仅是ID和密码,还有其他数据,目前大约有7个信息部分。

这个检查在每个页面上都要进行。

我是将所有这些数据加载到会话中,然后从那里进行检查,还是在每个页面请求上执行查询呢?不用说,还有其他查询正在进行。

就优化而言,哪种做法更好?


进一步阐述这个问题,每次请求用户数据而不是检查会话是否更好?如果mod/admin删除了一个用户,那么用户如何被踢出应用程序?只要会话保持活动状态,用户就会在应用程序中登录。还有权限的问题吗?同样,如果mod/admin编辑了用户的权限,难道不应该在每个请求中请求这些权限,以便立即应用更改吗?我认为,在登录时将用户信息存储在会话中,然后检查用户数据的会话以进行连续请求似乎很危险。 - akinuri
5个回答

2

如果查询和上一次完全相同,MySQL会缓存该查询,因此通过MySQL获取用户信息是可以的。特别是如果您通过主键获取所有内容,这非常快。


大多数托管服务的查询缓存默认开启,还是需要手动开启? - Marko
进入phpmyadmin > 运行SQL查询 > 粘贴以下内容 > "show variables like 'query_cache_size';",它将显示您的查询缓存大小。我的本地主机默认情况下已关闭。 - Anil
看起来查询缓存无法处理带有占位符的预处理语句,因此我无法使用这种缓存方式。 - Marko
@Marko 没有任何东西可以缓存具有占位符的语句,因为没有什么可缓存的 - 占位符意味着它还没有数据。它应该如何进行缓存呢?您可以缓存查询计划,但这是一个不同的问题。 - Ariel

2
你应该从数据库中调用一次数据并将其存储在Session变量中。当用户首次登录时,我通常会将user_id、用户名、电子邮件、用户姓名和访问级别存储在Session中,然后在用户登录期间可以在应用程序中的任何位置调用它们。
不要将密码存储在Session中,因为它是不必要的。
你还可以创建一个名为logged_in的变量,并将其设置为true或false进行测试(例如:如果用户已登录,则显示“帐户”菜单,否则显示“注册”菜单)。
[更新]
这里有一个链接,介绍了MySQL缓存的优缺点。
请先滚动到底部再查看评论。 对于小型网站,查询缓存就足够了,但如果你想开发更具可扩展性的应用程序,你需要考虑速度方面的问题。
如何判断mysql查询缓存是否启用:[LINK]

0

访问数据库的速度比访问会话慢。你应该绝对使用会话。只是不要忘记,如果这些数据在数据库中发生了变化,也应该在当前会话中进行更改。


在内部,会话是磁盘上的文件。我并不认为打开、解析和读取文件比让本地MySQL服务器从其缓存中检索结果更快。特别是考虑到他将不得不处理多少额外的代码来使这个工作正常。 - Ariel
这实际上取决于他向数据库发送了多少查询。就性能而言,数据传输并不痛苦。连接是痛点(除非他使用持久连接,但我认为这是不可取的)。此外,请不要忘记PHP会在内部处理会话,因此它们非常快。除此之外,添加memcached会话处理程序,这是最快的方式。无论如何,对此感兴趣-我将在本周末进行一些基准测试 :)P.S. 从未见过一个Web应用程序总是检查用户数据是否在数据库中,而不是使用会话。 - Andrius Virbičianskas
本地MySQL连接非常快,比打开和读取文件更快。对于远程数据库(不在同一台机器上),您是正确的。附注:如果您从未见过不使用会话的Web应用程序,则说明您没有仔细观察。 - Ariel

0
如果数据变化不太大,您可以将其缓存到文件中……或者使用像memcache这样的东西将其缓存到内存中。
然后,您可以通过此文件包含它,并设置一些阈值以确定何时从数据库获取或仅包含。

MySQL有一个内置缓存:http://dev.mysql.com/doc/refman/5.5/en/query-cache.html,您不需要双重缓存。除非您的数据量变得非常大。 - Ariel
我们不知道他的应用程序规模,因此提供我的经验建议。 - Brian
应用程序将被启动,因此现在它没有进行缩放,并且在开始时也不会进行缩放,但我的职责是为了进行缩放。 - Marko
对于我经营的几个大型网站,我们使用memcached等工具取得了良好的效果,但如果你的资源有限,最简单的方法就是将内容缓存到文件中。这完全取决于你的查询有多昂贵(耗时)。还有其他选择,如MongoDB、CouchDB等,都可用于高可用性的网站。 - Brian
我可以拥有多少文件?例如,对于10000个用户,就有10000个文件。这会有什么影响吗? - Marko
@Marko,你正在接近过早优化的领域。你不知道你的应用程序实际上会变慢的部分。我建议先找到慢的部分,然后再修复它。你可能会感到惊讶。 - Ariel

0

你的问题中使用了“check”这个词 - 你是指每次页面请求都需要验证数据吗?如果是这样,你可能无法避免访问数据库。

如果你只需要存储在同一用户的不同页面之间不变的数据,那么你应该使用会话(sessions)。但请务必先阅读zend.com网站上的白皮书“PHP不是Java”!


我需要读取数据来创建页面,而这些数据是随机变化的,但是它们可以被改变,所以我需要一直检查。 - Marko
是的,那么你每个页面都必须去访问数据库。这目前是否是一个可衡量的性能问题? - Neville Kuyt
目前还不需要,因为应用程序尚未启动,在使用初期这不会成为问题,但由于编码正在进行中,我觉得最好一次做对,以后就不必担心了。 - Marko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接