是否有可能跨PHP的会话持有一个mysql对象?

时间:2012-09-12 02:43:15

标签: php mysql session

例如,在这种情况下,'views'计数在会话期间显然正常递增但是mysqli对象没有被维护,并且在会话期间不能被重用(如果页面被刷新或者其他)。 _SESSION全局只能包含简单类型吗?还有什么可以限制这个?编辑:我希望这是为了提高性能。因此,如果有另一种方法可以实现这一点,我很高兴知道。

<?php
session_start();

if(isset($_SESSION['db']))
{
    $mysqli = $_SESSION['db'];
    $_SESSION['views']=$_SESSION['views']+1;
}
else
{
    $mysqli = new mysqli(...);
    $_SESSION['db'] = $mysqli;
    $_SESSION['views']=1;
}

echo "Views=". $_SESSION['views'];    

?>

2 个答案:

答案 0 :(得分:3)

不,没有php资源可序列化。因此,您需要每次都实例化mysqli对象。

  编辑:我希望这是为了提高绩效。

头号性能优化规则是:第一个衡量 - 第二个优化。没有剖析(测量),世界上任何人都无法说出性能问题。

那么,你的应用程序运行速度难以接受吗?好吧,衡量是什么让它如此缓慢并优化那个特定的地方。我可以向你保证,这不是与mysql的连接。

答案 1 :(得分:0)

你不能直接这样做。但你可以使用魔术方法:__sleep() and __wakeup()

class Connection {
    protected $link;
    private $server, $username, $password, $db;

    public function __construct($server, $username, $password, $db) {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

    private function connect() {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

    public function __sleep() {
        return array('server', 'username', 'password', 'db');
    }

    public function __wakeup() {
        $this->connect();
    }
}

我不认为在会议中这样做是必要的。