0

我有一门课程,其中包括mysql链接和其他。我在加载首页时创建了此类的一个对象,但我不想在重新加载页面时再次创建。

mysql不能存储在会话中,那么有没有其他方法可以全局保存对象?

4

3 回答 3

4

我认为你想要的是持久的数据库连接

这需要稍微修改您的连接代码,但是您无需手动管理持久性(即您无需手动将某些内容放入会话中)。

不过,请确保在继续之前阅读大量内容。有很多含义。

于 2012-11-02T22:16:58.713 回答
0

一些选项:

  • 使用 APC 缓存缓存对象
  • 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 中,以及会话

于 2012-11-02T22:15:36.187 回答
0

如果您尝试避免与 MySQL 的多个连接,您可以使用mysql_pconnect的持久连接。

“首先,连接时,该函数将首先尝试查找已使用相同主机、用户名和密码打开的(永久)链接。如果找到,将返回它的标识符,而不是打开新连接。”

于 2012-11-02T22:17:00.457 回答