在PHP中重用对象

时间:2012-11-02 22:12:55

标签: php mysql session global-variables

我有一个包含mysql链接和其他内容的课程。我在加载首页时创建了这个类的对象,但是当我重新加载页面时我不想再创建它。

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

3 个答案:

答案 0 :(得分:4)

我认为你想要的是persistent database connections

这需要稍微修改您的连接代码,但之后您不会手动管理持久性(即您不会在会话中手动放置内容)。

尽管如此,请确保在阅读之前阅读了大量内容。有很多含义。

答案 1 :(得分: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中缓存,以及会话

答案 2 :(得分:0)

如果你试着避免几个连接到MySQL,你可以使用与mysql_pconnect的持久连接。

  

“首先,在连接时,该函数首先尝试查找已经打开的具有相同主机,用户名和密码的(持久)链接。如果找到一个,将返回一个标识符,而不是打开一个新的连接“。