在会话变量中存储数据库连接

ste*_*225 7 php database session-variables

可能重复:
无法在php中的会话中传递mysqli连接

我们中的许多人编写了需要数据库的PHP应用程序; 主要是MySQL,但我经常使用非常小的MS Access数据库,因为技术能力较差的人可以下载调整它们/保存备份/等等.在他们自己(这是否正确,我不知道).

我注意到的是,花了很多时间来连接和运行一些相同的查询.因此,我有一个有趣的想法:存储连接和可能的结果集,这些结果集在$_SESSION变量中大部分是静态的,以减轻用户导航网站时的负担.

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

我的问题归结为:这真的有可能吗?如果是这样,我应该注意哪些事情(除了会话固定,因为它是适用于所有会话的自身问题)?

dec*_*eze 13

您无法在会话中存储数据库连接或结果集,因为这些是资源,并且:

某些类型的数据无法序列化,因此存储在会话中.它包括资源变量或具有循环引用的对象(即将对自身的引用传递给另一个对象的对象).

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

您可以将结果集提取到普通数组中,并将其存储在会话中,就像任何其他变量一样.无论如何,那将是一个相当典型的会话用例.请注意不要在会话中存储太多数据,因为这比从数据库中获取数据更加沉重.


Joh*_*een 10

即使你可以这样做(资源与数据),这也是一个坏主意.你会风有很多打开的并发连接,这将打击你的最大连接速度非常快的......特别是如果它的生命周期展开超过100毫秒子(取决于你的查询)到20分钟以上.使用开放连接,像MySQL这样的东西也无法正确地重置其内存分配,整个系统都会变得很糟糕.简而言之,除非您的代码的唯一消费者是单个用户,否则这不是DB的用途.

作为替代方案,我强烈建议使用专门用于减少数据库负载和避免连接时间的缓存技术.使用类似的,最简单的,memcached将大大提高性能,并且您将能够确切地指定有多少系统资源进入缓存 - 同时让数据库在需要时完成数据获取工作至.