How do I make my PDO connection more efficient?
好吧,我想我应该先说下面的代码片段是我的最终目标。我希望能够在应用程序的任何地方运行这样的一行,并让它处理PDO连接和执行:
为此,我在后台运行以下两个文件。
php:处理pdo连接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | class Connection { /** * The PDO connection. * * @var PDO */ protected $pdo = NULL; /** * The type of database we're connection to. * * @var string */ protected $type = ''; /** * The name of the connected database. * * @var string */ protected $database = ''; /** * The database connection details. * * @var array */ protected $config = array(); /** * Create the connection instance. * */ public function __construct() { // Import the configuration information from database.php $this->config = Config::load('database'); // Pull the database type $this->type = $this->config['database']; // Pull the database name if(isset($this->config[$this->type]['database'])) { $this->database = $this->config[$this->type]['database']; } // Check to see if a connection has been made or not if($this->pdo==NULL) { // Create the connection $this->pdo = $this->createConnection(); } } /** * Query the database. * * @param string $query * @return array */ public function query($query) { // Check to see if we have a connection if($this->pdo!=NULL) { // Execute the raw query $query = $this->pdo->query($query); return $query; } return false; } /** * Execute a query on the database. * * @param string $query * @return int */ public function exec($query) { // Check to see if we have a connection if($this->pdo!=NULL) { // Execute the raw query $execution = $this->pdo->exec($query); return $execution; } return false; } /** * Execute a query and return the last inserted Id * * @param string $query * @return int */ public function execLastId($query) { // Check to see if we have a connection if($this->pdo!=NULL) { // Execute the query and return the Id if($this->exec($query)) { return $this->pdo->lastInsertId(); } } return false; } /** * Prepare and execute against the database. * * @param string $query * @param array $params * @return array */ public function prepare($query, $params) { // Check to see if we have a connection if($this->pdo!=NULL) { // Prepare the query $query = $this->pdo->prepare($query); // Execute the query $query->execute($params); return $query->fetchAll(); } return false; } /** * Create a new PDO connection. * * @return PDO */ protected function createConnection() { // See if we can attempt to make a connection if(isset($this->config[$this->type])) { $hasDSN = false; // Decide what DSN to use if($this->type=='mysql') { $hasDSN = true; $dsn = $this->getMySQLDSN(); } // If a DSN has been found, make the connection if($hasDSN) { $username = $this->config[$this->type]['username']; $password = $this->config[$this->type]['password']; return new PDO($dsn, $username, $password); } } return NULL; } /** * Get the MySQL DSN. * * @return string */ protected function getMySQLDSN() { return 'mysql:host='.$this->config['mysql']['hostname'].';dbname='.$this->database; } } |
database.php:位于连接之间的中间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | class Database { /** * Run a raw query on the database. * * @param string $query * @return array */ public static function query($query) { // Create the connection $conn = new Connection; // Return the query return $conn->query($query); } /** * Execute a query on the database. * * @param string $query * @return int */ public static function exec($query) { // Create the connection $conn = new Connection; // Return the query return $conn->exec($query); } /** * Execute a query and return the last inserted Id * * @param string $query * @return int */ public static function execLastId($query) { // Create the connection $conn = new Connection; // Return the query return $conn->execLastId($query); } /** * Prepare and then execute a query. * * @param string $query * @param array $params * @return array */ public static function prepare($query, array $params) { // Create the connection $conn = new Connection; // Return the query return $conn->prepare($query, $params); } } |
我的问题是:这有效率吗?有更简单的方法吗?我很感谢你的指导。我喜欢把自己想象成一个初学者,但我确实缺乏确保应用程序高效和减轻自身重量的经验。
这是不有效的。每次执行查询时,都会创建一个新的连接对象,从而创建一个新的PDO连接。连接到数据库会给您带来一些开销。实际上你不需要每次都连接。您只需连接一次,然后将该连接用于后续查询。
因此,通过一个小的更改,您可以使数据库类在第一次使用时创建连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class Database { /** * Reference to the connection */ private static $connection = null; /** * Run a raw query on the database. * * @param string $query * @return array */ public static function query($query) { // Get the connection $conn = self::getConnection(); // Return the query return $conn->query($query); } public static function getConnection() { // Create the connection if needed. if (self::$connection === null) { self::$connection = new Connection; } // Return new or existing instance. return self::$connection; } ... |