對於PHP程式來來說,MySQL是一種稀缺的資源。MySQL預設最大串連數為100,也即是最多接受100個MySQL的用戶端串連。因此,PHP在使用MySQL串連時做了一些最佳化的處理。這些最佳化,可能對效能有所提升,但對使用MySQL串連的使用卻也造成一些困惑。
建立MySQL串連:
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )
當使用mysql_connect()建立一個MySQL串連後,PHP會把這個串連的資訊,包括host, username, password與串連資源儲存起來。下次調用mysql_connect()時,PHP會預設檢查是否存在一個參數相同(參數包括host, username, password)的串連資源,如果存在,則直接返回之前建立的資源,而非建立一個MySQL串連。(PS:當兩次調用串連的不是相同伺服器時,只能建立新的MySQL串連,舊的串連無法共用)
只有當手動指定new_link為true時,PHP才會避開這個檢查,直接重新向PHP伺服器發起MySQL串連請求。
這種處理在下面這種情況下就會產生錯誤:
- $conn1 = mysql_connect($dbhost, $dbuser, $dbpwd);
- mysql_select_db('database1', $conn1);
- $conn2 = mysql_connect($dbhost, $dbuser, $dbpwd);
- mysql_select_db('database2', $conn2);
-
- mysql_query('select * from table1', $conn1);
使用者期望在database1查詢table1的資訊,但是由於在第二次mysql_connect(),PHP返回的是上一次的MySQL串連資源。因此,對於$conn2中切換資料庫也對$conn1造成了影響,$conn1也同時切換預設到資料庫database2,查詢的資訊會是在database2上面的結果。
解決這個問題的方法就是在第二次調用mysql_connect()時,指定new_link為true即可。
關閉MySQL串連:
對於使用mysql_connect()建立的串連資源,對資源變數進行unset()並不能真正地釋放資源,需要調用mysql_close()才能達到釋放MySQL串連資源的效果。
需要注意的是:使用mysql_connect()擷取共用MySQL串連資源時,調用mysql_close()有時並不能釋放MySQL串連,只有當所有共用串連資源都調用mysql_close()時,PHP才會真正釋放MySQL串連。