2013-04-15 45 views
0

我想弄清楚在PHP中處理數據庫通信的最佳方式,通過FastCGI進行MySQL設置並使用PHP-FPM;這是一個比較繁重的站點,每秒有100到1,000個SQL查詢,所以我希望儘可能提高效率。PHP,MySQL,FastCGI - 處理很多查詢的最佳方式

我正在重寫部分網站,並在新代碼中使用PDO,並通過執行database :: insertEmployee($ name,$ SIN,$ DOB,$ position)來處理DB查詢和連接。 。我擔心的是每個查詢都會建立一個新的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

我認爲第一步是確定正在運行的實際查詢。我不確定你會每秒插入1000名員工。 – Sebas

+0

:)你是對的,insertEmployee是一個虛擬函數。我正在使用的應用程序查詢數據庫的下一個內容,查看日誌內容,日誌點擊操作等。 – Kate

回答

0

我擔心的是每個查詢都會建立一個新的PDO連接。

那麼,請驗證您的關注,因爲我會說這可能不是這種情況。

由於性能方面的原因,請注意您正在使用mysql本機驅動程序,因爲這樣可以擴展PHP與數據庫交互的指標。

此外,Oracle還爲Mysql提供專業的支持計劃,它們具有良好的監控工具和非常好的支持,可以幫助您獲得數據庫和PHP代碼,以便流量處理。

+0

我已經追蹤並記錄了getInstance函數,並且isset(self :: $ instance)總是等於false並且最終通過構造函數。 – Kate

+0

是的,但新對象已創建,而不是新連接。 Mysql管理連接池。 – Sebas

+0

然而,在fastCGI的情況下,我不知道這是甚至可能的,MySQL重用先前的連接... – Sebas