2024 PHP Conference Japan

連線與連線管理

透過建立 PDO 基礎類別的實例來建立連線。 無論您想使用哪種驅動程式,您始終使用 PDO 類別名稱。 建構函式接受用於指定資料來源(稱為 DSN)的參數,以及使用者名稱和密碼(如果有的話)的選用參數。

範例 #1 連線到 MySQL

<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

如果發生任何連線錯誤,將會拋出一個 PDOException 物件。您可以選擇捕捉這個例外來處理錯誤狀況,或者讓您透過 set_exception_handler() 設定的應用程式全域例外處理器來處理。

範例 #2 處理連線錯誤

<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (
PDOException $e) {
// 例如,嘗試在一段逾時後重試連線
}

警告

就像任何其他例外一樣,PDOException 可以透過 catch 陳述式明確地捕捉,或者透過 set_exception_handler() 隱式地捕捉。否則,將會發生將未捕捉的例外轉換為 E_FATAL_ERROR 的預設行為。致命錯誤將包含可能洩漏連線詳細資訊的回溯追蹤。因此,在正式伺服器上,php.ini 選項 display_errors 應設定為 0

成功連線到資料庫後,PDO 類別的實例會返回到您的腳本。連線在該 PDO 物件的生命週期內保持有效。要關閉連線,您需要銷毀該物件,方法是確保刪除所有剩餘的對它的參考 — 您可以透過將 null 指派給持有該物件的變數來完成此操作。如果您沒有明確地執行此操作,PHP 會在您的腳本結束時自動關閉連線。

注意如果仍然存在對此 PDO 實例的其他參考(例如來自 PDOStatement 實例,或來自其他參考相同 PDO 實例的變數),則也必須移除這些參考(例如,透過將 null 指派給參考 PDOStatement 的變數)。

範例 #3 關閉連線

<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// 在此使用連線
$sth = $dbh->query('SELECT * FROM foo');

// 使用完畢後關閉連線
$sth = null;
$dbh = null;
?>

許多網頁應用程式都能受益於與資料庫伺服器建立持續性連線。持續性連線不會在腳本結束時關閉,而是會被快取並在其他腳本使用相同憑證請求連線時重複使用。持續性連線快取讓您避免每次腳本需要與資料庫通訊時建立新連線的額外負擔,從而加快網頁應用程式的速度。

範例 #4 持續性連線

<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>

PDO::ATTR_PERSISTENT 選項的值會被轉換為 布林值 (啟用/停用持續性連線),除非它是一個非數字的 字串,在這種情況下,它允許使用多個持續性連線池。如果不同的連線使用不相容的設定,例如不同的 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 值,這會很有用。

注意事項:

如果您想使用持續性連線,您必須在傳遞給 PDO 建構函式的驅動程式選項陣列中設定 PDO::ATTR_PERSISTENT。如果在物件實例化後使用 PDO::setAttribute() 設定此屬性,驅動程式將不會使用持續性連線。

注意事項:

如果您正在使用 PDO ODBC 驅動程式,並且您的 ODBC 函式庫支援 ODBC 連線池 (unixODBC 和 Windows 都支援;可能還有更多),那麼建議您不要使用 PDO 持續性連線,而是將連線快取留給 ODBC 連線池層處理。ODBC 連線池會與程式中的其他模組共享;如果 PDO 被告知要快取連線,那麼該連線將永遠不會返回到 ODBC 連線池,導致建立額外的連線來服務那些其他模組。

新增筆記

使用者貢獻的筆記

此頁面尚無使用者貢獻的筆記。
To Top