2014-02-10 98 views
0

我已經從mysqli類中擴展了我的數據庫模型,但我不希望它每次重新連接時都會實例化一個新模型,因爲它確實會減慢整個腳本的速度。如何檢查PHP中是否存在活動的MySQLi連接?

我有一個Database類從mysqli延伸,並且其它模型類Database延伸。

Database類看起來是這樣的:

class Database extends mysqli { 

    // some properties ... 

    public function __construct() { 
     parent::__construct(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
     $this->set_charset(MySQL_CHARACTER_SET); 

     // initializing stuff ..    
    } 

    // some other methods...  
} 

樣本模型類是這樣的:

class User extends Database { 
    protected $table = "users"; 

public function __construct($id = null) { 
    // Calling the parent constructor. 
    parent::__construct(); 
    if($id) { 
     // This is the current logged-in user. 
     // Importing all session data into this object. 
     $this->data->import($this->session->all()); 
     // ^^ This imports all the user related session data into this object 
     // i don't think it's relevant but i'll leave it here just in case. 
    }     
} 

我的問題是,

  • 我如何檢查有一個活動的mysqli連接?

  • 我該如何防止它重新連接並使用活動連接呢?

  • 我可以遵循哪些其他方法?

  • 我應該遷移到PDO,我必須嗎? 爲什麼?

P.S:遷移到PDO將是大量的返工,因爲我已經建了的事情庫MySQLi。

回答

1
  • 如何檢查是否有積極的mysqli連接?

您可以使用mysqli::ping()方法檢查連接是否處於活動狀態。

這是php.net

if ($mysqli->ping()) { 
    printf ("Our connection is ok!\n"); 
} else { 
    printf ("Error: %s\n", $mysqli->error); 
} 
  • 我怎樣才能防止它重新連接,使用主動連接呢?

正如其他答案所說,使用持久連接將解決您的問題。將p:前綴添加到您的主機名稱。

parent::__construct("p:" . MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
  • 我可以遵循什麼其他辦法?

你可以考慮使用PDO來代替,但如果你並不需要支持其他類型的數據庫,或者準備語句的mysqli看起來更加輕盈給我。

+0

謝謝你的詳細解答。我接受你的。 –

1

當連接到數據庫時,可以在主機名之前放置p:以啓動持久連接。像,p:mysite.comp:localhost。這可能與速度的幫助(如果你還沒有這樣做的話)

+0

謝謝您的回答!我剛剛嘗試過,它讓一切都變得更快。如果你能爲我的其他問題提供答案,我會接受你的答案。 –

+0

歡迎您!如果此答案適用於您,請將其標記爲正確答案。謝謝! – SyntaxLAMP

1

試試這個:

parent::__construct("p:".$host, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
+0

我很抱歉,但我沒有使用程序方法。這也是@SyntaxLAMP建議的。工作正常,但對我的問題還不夠。謝謝。 –