我试图找出在PHP中处理数据库通信的最佳方法,通过FastCGI和usig PHP-FPM进行MySQL设置;这是一个相对繁重的使用站点,每秒有100到1,000个SQL查询,所以我希望尽可能高效。
我正在重写网站的部分内容,在新代码中我正在使用PDO,并通过数据库:: insertEmployee($ name,$ SIN,$ DOB,$ position)使用以下类来处理数据库查询和连接。我担心的是,每次查询都会建立一个新的PDO连接。我应该尝试建立持久连接???
class database
{
protected $dbh;
protected static $instance;
private function __construct()
{
try {
// building data source name from config
$dsn = 'mysql:=' . DB_Config::read('db.host') .
';dbname=' . DB_Config::read('db.name');
$user = DB_Config::read('db.user');
$password = DB_Config::read('db.password');
$this->dbh = new PDO($dsn, $user, $password);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
//@TODO-KP: log and alert
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
public static function getInstance()
{
if (!isset(self::$instance)) {
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
public static function insertEmployee($name, $position, $SIN, $DOB)
{
$dbi = self::getInstance();
try {
$sthEmployee = $dbi->dbh->prepare('INSERT INTO employees SET
name = :name
, position = :position
, SIN = :SIN
, DOB = :DOB'
);
$sthEmployee->bindParam(':name', $name);
$sthEmployee->bindParam(':position', $position);
$sthEmployee->bindParam(':SIN', $SIN);
$sthEmployee->bindParam(':DOB', date('Y-m-d G:i:s', $DOB));
return $sthEmployee->execute();
} catch (PDOException $e) {
//@FIXME-KP: log and alert
print "Error!: " . $e->getMessage() . "-- name [$name]";
return '';
}
}
}
对最有效方法的任何想法都会非常非常感激!
凯瑟琳。
答案 0 :(得分:0)
我担心的是,每次查询都会建立新的PDO连接。
好吧,请核实您的担忧,因为我会说这可能不是这样。
出于性能原因,请注意您正在使用底层的mysql本机驱动程序,因为这允许PHP与数据库之间的交互扩展指标。
还可以从Oracle for Mysql获得专业支持计划,他们拥有良好的监控工具和非常好的支持,可以帮助您准备好数据库和PHP代码以便处理流量。