2011-08-25 96 views
1

對於那些對性能有深入瞭解的人來說,這只是一個簡單的問題。我創建了一個「MySQL」類,每次執行查詢時,我都會創建一個新的MySQL對象。見下面PHP/MySQL性能問題

public function get_am_sales() { 
     $mysql = new MySQL(); 
     $mysql->connect(); 
     $query = "some query"; 
     $mysql->query($query); 
     $result = $mysql->return_assoc(); 
     unset($mysql); 
     return $result; 
    } 

    public function get_pm_sales() { 
     $mysql = new MySQL(); 
     $mysql->connect(); 
     $query = "some query"; 
     $mysql->query($query); 
     $result = $mysql->return_assoc(); 
     unset($mysql); 
     return $result; 
    } 

    public function get_comp_sales() { 
     $mysql = new MySQL(); 
     $mysql->connect(); 
     $query = "some query"; 
     $mysql->query($query); 
     $result = $mysql->return_assoc(); 
     unset($mysql); 
     return $result; 
    } 

$sales = new Sales(); 
$amSales = $sales->get_am_sales(); 
$pmSales = $sales->get_pm_sales(); 
$compSales = $sales->get_comp_sales(); 

上面的代碼很明顯的作品,但我想知道如果這是一個性能命中,因爲我打開和關閉與每個函數調用的連接。我試圖用一個連接來實現這個類,但是我得到錯誤。見下面

public function connect() { 
     $this->mysql = new MySQL(); 
     $this->mysql->connect(); 
    } 

    public function get_am_sales() { 
     $query = "SELECT site_id, dly_sls AS am_sales, cov_cnt AS am_covers 
        FROM v_sales_yesterday 
        WHERE am_pm = 'AM' 
        GROUP BY site_id 
        ORDER BY site_id ASC"; 
     $this->mysql->query($query); 
     $result = $this->mysql->return_assoc(); 
     return $result; 
    } 

    public function get_pm_sales() { 
     $query = "SELECT site_id, dly_sls AS pm_sales, cov_cnt AS pm_covers 
        FROM v_sales_today 
        WHERE am_pm = 'PM' 
        GROUP BY site_id 
        ORDER BY site_id ASC"; 
     $this->mysql->query($query); 
     $result = $this->mysql->return_assoc(); 
     return $result; 
    } 

    public function get_comp_sales() { 
     $query = "SELECT business_date, site_id, dly_sls AS comp_sales 
        FROM v_sales_today_comp 
        WHERE am_pm = 'PM' 
        GROUP BY site_id 
        ORDER BY site_id ASC"; 
     $this->mysql->query($query); 
     $result = $this->mysql->return_assoc(); 
     return $result; 
    } 

    public function disconnect() { 
     unset($this->mysql); 
    } 

$sales = new Sales(); 
$sales->connect(); 
$amSales = $sales->get_am_sales(); 
$pmSales = $sales->get_pm_sales(); 
$compSales = $sales->get_comp_sales(); 
$sales->disconnect(); 

執行「連接」函數後mysql連接是否關閉?如果認爲有必要,那麼保持連接打開的最佳方式是什麼(使用面向對象的方法)?如果您需要更多的細節,請告訴我,我很感謝您的幫助。

+0

你得到的錯誤是什麼?通常情況下,您不能重新連接。爲了防止多重連接,你還應該爲你的DB類使用[singleton-pattern](http://php.net/manual/en/language.oop5.patterns.php#language.oop5.patterns.singleton)。 – feeela

+0

我在嘗試查詢時遇到錯誤,這導致我認爲連接在查詢之前關閉。 – Brett

+0

好的,我再問一次:你得到了什麼/哪個錯誤?停止假設,嘗試測試或調試。 – feeela

回答

1

通常,您只想在應用程序執行期間創建一次MySQL實例。

如果你有一個總體的Application對象,那麼你可以在Application對象中創建你的MySQL實例並從那裏訪問它。

另一種選擇是爲您的MySQL實例創建一個Singleton對象,然後通過「實例()」方法對其進行訪問。

這樣,你只在php腳本的執行週期中打開一個連接,它將在腳本執行結束時被丟棄。

所以,現在你的代碼看起來像這樣:

$query = "SELECT * FROM users"; 

$rs = Mysql::instance()->query($query); 

如果你需要,你可以如何設置看你的目的Singleton實例工作實例: