>  기사  >  백엔드 개발  >  关于单列模式和内存相关的

关于单列模式和内存相关的

WBOY
WBOY원래의
2016-06-06 20:25:071189검색

一、单例模式可以保证一个对象只实例化一次,这个我该怎么理解呢?是A用户本次请求在这个进程中只是实例化一次还是A用户实例化以后,B用户在来访问时如果A实例化也是用的A的,如果是按后者来说的话,那如下代码也就是说数据库的连接数只是一个咯?不是吧?(如下代码)

class nmdb
{

<code>private $link;
static private $_instance;
// 连接数据库
private function __construct($host, $username, $password)
{
    $this->link = mysql_connect($host, $username, $password);
    $this->query("SET NAMES 'utf8'", $this->link);
    //echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
    //var_dump($this->link);
    return $this->link;
}

private function __clone(){}

public static function get_class_nmdb($host, $username, $password)
{
    //$connector = new nmdb($host, $username, $password);
    //return $connector;
    
    if( FALSE == (self::$_instance instanceof self) )
    {
        self::$_instance = new self($host, $username, $password);
    }
    return self::$_instance;
}

// 连接数据表
public function select_db($database)
{
    $this->result = mysql_select_db($database);
    return $this->result;
}

// 执行SQL语句
public function query($query)
{
    return $this->result = mysql_query($query, $this->link);
}

// 将结果集保存为数组
public function fetch_array($fetch_array)
{
    return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
}

// 获得记录数目
public function num_rows($query)
{
    return $this->result = mysql_num_rows($query);
}

// 关闭数据库连接
public function close()
{
    return $this->result = mysql_close($this->link);
}
</code>

}
?>

回复内容:

一、单例模式可以保证一个对象只实例化一次,这个我该怎么理解呢?是A用户本次请求在这个进程中只是实例化一次还是A用户实例化以后,B用户在来访问时如果A实例化也是用的A的,如果是按后者来说的话,那如下代码也就是说数据库的连接数只是一个咯?不是吧?(如下代码)

class nmdb
{

<code>private $link;
static private $_instance;
// 连接数据库
private function __construct($host, $username, $password)
{
    $this->link = mysql_connect($host, $username, $password);
    $this->query("SET NAMES 'utf8'", $this->link);
    //echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
    //var_dump($this->link);
    return $this->link;
}

private function __clone(){}

public static function get_class_nmdb($host, $username, $password)
{
    //$connector = new nmdb($host, $username, $password);
    //return $connector;
    
    if( FALSE == (self::$_instance instanceof self) )
    {
        self::$_instance = new self($host, $username, $password);
    }
    return self::$_instance;
}

// 连接数据表
public function select_db($database)
{
    $this->result = mysql_select_db($database);
    return $this->result;
}

// 执行SQL语句
public function query($query)
{
    return $this->result = mysql_query($query, $this->link);
}

// 将结果集保存为数组
public function fetch_array($fetch_array)
{
    return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
}

// 获得记录数目
public function num_rows($query)
{
    return $this->result = mysql_num_rows($query);
}

// 关闭数据库连接
public function close()
{
    return $this->result = mysql_close($this->link);
}
</code>

}
?>

PHP-FPM 机制是每个请求完毕后释放所有资源,包括数据库实例。

所以PHP-FPM下每个请求都会实例化一次数据库实例。A用户的请求和B用户的请求使用的是不同的数据库实例。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.