如何避免新的PDO(...)代码行出现太频繁?

时间:2014-01-15 20:18:10

标签: php pdo

作为一个新手,我想了解一下关于数据库连接的事情。

我从PHP教程开始,该教程具有以下结构:

Connect.php

<?php 

$username = "dbusername"; 
$password = "dbpassword"; 
$host = "localhost"; 
$dbname = "dbname"; 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

try 

{ 
    $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
} 
catch(PDOException $ex) 
{ 
    die("Failed to connect to the database: " . $ex->getMessage());  
} 

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 


header('Content-Type: text/html; charset=utf-8'); 

session_start(); 
?>

Login.php

<?php
 require("connect.php");     
 // some code not important for this question, 
 //that handles login with a session…
?>

various_file_in_the_login_system.php

 <?php
  require("connect.php");
  //  some code that checks  if user is logged in with session_ …
  // some code that does need the database connection to work
  ?>

所有其他文件也包含require("connect.php");行。它工作,但我只是不知道这些连接请求到服务器 - 我可能没有使用正确的词汇 - 最终做到服务器。如果连接没有超时,它们是多余的,不是吗?

我发现了一篇关于为PDO做单身人士的帖子,以及一篇让我觉得我生活中永远不会使用持久连接的帖子。

此设计是否会导致连接过度搅拌?

也许服务器每秒可以处理很多连接请求,也许服务器有自己的内部持久连接模式,或实现连接池... 或者PDO对象无缘无故地处理经常询问连接的问题......

PDO + Singleton : Why using it?

What are the disadvantages of using persistent connection in PDO

2 个答案:

答案 0 :(得分:1)

这是我建议的数据库连接: 为连接创建一个类:

class Database{
private static $link = null ;

public static function getConnection ( ) {
    if (self :: $link) {
        return self :: $link;
    }

    $dsn = "mysql:dbname=social_network;host=localhost";
    $user = "user";
    $password = "pass";

    self :: $link = new PDO($dsn, $user, $password);
    return self :: $link;
}

}

然后你可以得到这样的连接:

Database::getConnection();

Singleton模式难以扩展 - 但是,我认为它可能对您的需求很好。它需要大量的数据库负载。

我认为你无法避免多重包含。

有一个用于在每个脚本前添加文件的php.ini设置 - &gt; http://www.php.net/manual/en/ini.core.php#ini.auto-prepend-file

答案 1 :(得分:1)

你如何改变

require_once('connect.php');

在所有地方?

此外,您应该从与建立数据库连接有关的代码段中删除session_start()和HTTP标头逻辑。这根本没有意义。