2011-05-21 125 views
6

可能重复:
Can't pass mysqli connection in session in php存储数据库连接

我们很多人都写了需要使用数据库的PHP应用程序的;主要是MySQL,但我经常使用非常小的MS Access数据库为技术能力较差的人,所以他们可以下载一个调整他们/保存备份/等。 (无论这是否正确,我不知道)。

我注意到,很多时间都花在连接和运行一些相同的查询上。正因为如此,我有一个有趣的想法:存储连接和可能的结果集,这些结果集在$_SESSION变量中通常是静态的,以减轻用户浏览网站时的负担。

显然这样做需要很多考虑。像会话被销毁时关闭连接这样的事情只是一个开始。

我的问题归结为:这真的有可能吗?如果是这样,我应该知道什么事情(除了session fixation,因为它是它自己的问题,适用于所有会议)?

回答

10

即使你可以做到这一点(资源与数据),这是一个坏主意。您将得到许多并发的开放连接,这将极大地影响您的最大连接...特别是如果其生命周期超过100毫秒(取决于您的查询)扩展到20分钟或更长时间。在开放连接的情况下,像MySQL这样的东西也不能正确地重置内存分配,整个系统会下地狱。简而言之,除非您的代码的唯一使用者是单个用户,否则这不是数据库的用途。

作为替代方案,我强烈推荐专门设计用于减少数据库负载和避免连接时间的高速缓存技术。使用类似于最简单的memcached将大大提高性能,并且您可以精确指定有多少系统资源进入缓存 - 同时让数据库在需要时获取数据至。

+0

我没有想到连接问题。这就是为什么我问:) – steveo225 2011-05-21 00:49:52

+0

看看Memcached。我在没有数据库的网站上使用它...甚至让我建立一个复杂的PHP页面,并整天提供服务(无需重新渲染),它会被SVN签入无效。 – 2011-05-21 00:54:13

11

无法存储数据库连接或结果集在会话中,这是因为它们资源和:

某些类型的数据不能被序列化因此也就不能保存在会话。它包含资源变量或带有循环引用的对象(即将对其自身的引用传递给另一个对象的对象)。

http://php.net/manual/en/intro.session.php

您可以提取设定成正常阵列的结果和存储在任何其他变量的会话。无论如何,这将是一个相当典型的会话用例。只是要小心,不要在会话中存储太多数据,因为这可能会比从数据库中获取更多的资源。

+0

这应该是被接受的答案。 – 2016-10-20 21:11:58

1

你应该在某些配置文件中更好地使用它们。会议是针对特定会议,而不是针对全球。