现在,每次我需要运行查询时,我都会调用一个名为connection()
的函数来创建新的PDO对象。
function connection(){
$host = 'localhost';
$user = 'user';
$pass = 'password';
$dbName = 'db_name';
new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
}
$db = connection();
$query = 'SELECT ...';
$stmt = $db->prepare($query);
$stmt->execute();
问题是网站创建此对象需要 1 秒,正如您可以想象的那样,如果我需要运行 4 个查询,页面将在 4 秒内加载。那么,有什么方法可以存储这个PDO对象来优化性能吗?
我在多个文件中使用此功能,所以我需要它。
如果您创建一个包含在页面顶部的配置.php文件怎么办。您只需要创建一次对象,页面上的所有查询都可以引用同一个对象:
function connection(){
$host = 'localhost';
$user = 'user';
$pass = 'password';
$dbName = 'db_name';
new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
}
$db = connection();
$query = 'Statement #1';
$stmt = $db->prepare($query);
$stmt->execute();
$query = 'Statement #2';
$stmt = $db->prepare($query);
$stmt->execute();
$query = 'Statement #3';
$stmt = $db->prepare($query);
$stmt->execute();
$query = 'Statement #4';
$stmt = $db->prepare($query);
$stmt->execute();
也许是这样的
function connection(){
static $CONN;
if (!$CONN) {
$host = 'localhost';
$user = 'user';
$pass = 'password';
$dbName = 'db_name';
$CONN = new PDO("mysql:host=$host; dbname=$dbName", $user, $pass);
}
return $CONN;
}
这可能会做你想要的,而无需太多额外的更改。
有几个人提到了静态和单例模式。代码如下所示,一次只保留 PDO 对象的一个实例:
class DB{
private static $_instance;
private $_pdo;
public static function getInstance(){
if(self::$_instance === NULL) {
$dsn = 'mysql:dbname=dbname;host=host';
$user = 'user';
$password = 'password';
// call constructor and assign instance
self::$_instance = new self($dsn, $user, $password);
}
return self::$_instance;
}
/**
* Creates new DB wrapping a PDO instance
*
* Constructor is private because this class can't be instantiated.
*
*/
private function __construct($dsn, $user, $password){
try {
$this->_pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
/**
* Singletons may not be cloned
*/
private function __clone() {}
/**
* Delegate every method call to PDO instance
*
* @param String $method
* @param Array $args
* @return Mixed
*/
public function __call($method, $args) {
return call_user_func_array(array($this->_pdo, $method), $args);
}
}
// To instantiate:
$db = DB::getInstance();