我有一个包含mysql
链接和其他内容的课程。我在加载首页时创建了这个类的对象,但是当我重新加载页面时我不想再创建它。
mysql
无法存储在会话中,有没有其他方法可以全局保存对象?
答案 0 :(得分:4)
我认为你想要的是persistent database connections。
这需要稍微修改您的连接代码,但之后您不会手动管理持久性(即您不会在会话中手动放置内容)。
尽管如此,请确保在阅读之前阅读了大量内容。有很多含义。
答案 1 :(得分:0)
一些选项:
serialize()
对象并将其保存到文件中。如果您再次需要,请阅读该文件并致电unserialize()
请记住,您无法以这种方式存储资源。对于对象的那一部分,您将希望像其他人所提到的那样使用持久连接。
编辑我想我会对此进行一些阐述,因为有一个明显的问题是无法保存mysql连接并且正在收到评论。
如果要在包含数据库连接的对象上保存/恢复,则需要处理无法序列化的位。您可以通过在序列化对象时取消设置属性,然后在对序列进行反序列化时重新创建属性来执行此操作。为了这个目的,PHP提供了两个方便的钩子__sleep()
和__wakeup()
。您可以像这样使用它们:
class SaveableConnection {
$connection = null;
public function __construct() {
$this->connect();
}
public function connect() {
// read config and connect
$this->connection = new PDO($dso);
}
public function __sleep() {
// get rid of the bit that cant be saved
unset($this->connection);
}
public function __wakeup() {
// re-create the bit that wasn't save on disk
$this->connect();
}
}
如果您正在使用持久性数据库连接,那么将通过从相关缓存中复制连接来优化$this->connection
的值。
对于任何暗示序列化的对象,您都可以使用相同的技巧:保存到文件,在memcached或APC中缓存,以及会话。
答案 2 :(得分:0)
如果你试着避免几个连接到MySQL,你可以使用与mysql_pconnect的持久连接。
“首先,在连接时,该函数首先尝试查找已经打开的具有相同主机,用户名和密码的(持久)链接。如果找到一个,将返回一个标识符,而不是打开一个新的连接“。