我有一门课程,其中包括mysql
链接和其他。我在加载首页时创建了此类的一个对象,但我不想在重新加载页面时再次创建。
mysql
不能存储在会话中,那么有没有其他方法可以全局保存对象?
我有一门课程,其中包括mysql
链接和其他。我在加载首页时创建了此类的一个对象,但我不想在重新加载页面时再次创建。
mysql
不能存储在会话中,那么有没有其他方法可以全局保存对象?
一些选项:
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 中,以及会话。
如果您尝试避免与 MySQL 的多个连接,您可以使用mysql_pconnect的持久连接。
“首先,连接时,该函数将首先尝试查找已使用相同主机、用户名和密码打开的(永久)链接。如果找到,将返回它的标识符,而不是打开新连接。”