名新 PHP 數據對象 (PDO) 數據抽象層的原始開發人員為您簡要介紹該抽象層,重點講述與 Oracle 一起運行的情況。
需要 PHP:5.0
需要其他:Oracle 8 或更高版本客戶端庫
下載用於 Oracle 的 PDO (Windows):php_pdo.dll, php_pdo_oci.dll
下載用於 Oracle 的 PDO (Unix):pdo, pdo_oci
PDO 簡介
PHP 主要是由志願者完成的項目;盡管有少數一些固定的“核心”開發人員,但是我們沒有一個人在全職受薪的開發 PHP。除此之外,我們分別位於世界不同地方,您可以想象長期開發的協調工作是何等困難。因此,PHP 主要是基於突發奇想的個人短期需求來發展的,其原因也多種多樣,有的是試驗,有的則是因為“明天有活要交”。盡管這樣通常每一步都會改善 PHP,但從長遠來看則是缺乏完整性 - 數據庫教程擴展就是一個重要的例子。
在各種不同的數據擴展(oci、mysql、postgresql、mssql 等)之間根本沒有真正的一致性,甚至在某些情況下,在這些擴展內部也沒有真正的一致性。幾乎所有這些擴展都在使用與基礎數據庫 API 緊密相連的不同代碼完成著相同種類的任務。而且因為我們(PHP 核心開發人員和擴展開發人員)的人手非常有限,因此這就造成了代碼更加難以維護,從而為 PHP 帶來了很大的問題。
由於 PHP 越來越受歡迎並不斷成功,因此主要 PHP 數據庫擴展的維護者們參加了在德國舉行的 LinuxTag 2003 大會,在會上我們交換了對 PHP 前景的看法。在討論 PHP 發展的隨機性時,我們確定了在 PHP 中進行數據庫訪問的一些目標:
·提供一種輕型、清晰、方便的 API
·統一各種不同 RDBMS 庫的共有特性,但不排除更高級的特性。
·通過 PHP 腳本提供可選的較大程度的抽象/兼容性。
我們之所以提出了這種 PHP 數據對象 (PDO) 的概念,是因為我們希望通過采用 Zend Engine 2(PHP 5 的核心)先進的面向對象特性獲得該 API 的一些更優秀的性能。
PHP 中的數據抽象層概念一點都算不上新;在 Google 中查詢“PHP database abstraction”會找到大約 83,200 個匹配項。它幾乎是許多 PHP 開發人員夢寐以求的,而其產生則部分歸因於我們不完整的 API。如果您曾經嘗試過使用第三方抽象層來完成任何真正重要的工作,通常會發現這些抽象層對於手頭的工作來說設計的功能過於強大了 - 或者表現為在使用前需要進行大量學習,或者表現為接口速度緩慢,參數需要經過多層腳本函數調用才能到達數據庫自有的 API;通常是存在上述兩種表象。
為什麼這些抽象層會存在這種問題?這些抽象層總是在試圖完成太多的任務,甚至可能是不可能的任務。我們決定以實用為目標,僅將一些最常見的數據庫 API 特性作為我們的基礎,並使得 PDO 驅動程序能夠將它們特定於產品的特性暴露為常規擴展函數。
為什麼使用 PDO?
聽過有關數據庫抽象擴展謠傳的大多數人會立刻對 PDO 的擴展方面產生疑惑 - 我們是否要分析 SQL,將其轉換為相應的後端方言呢?我們如何處理特性 X 或特性 Y,等等。因此,當您聽說我們在 PDO 中根本不用為此而擔憂時可能會大吃一驚;我們不希望使所有內容都完全統一,因為要使得這種統一成為可能,只能是將自己限制在最低的通用標准。
如果 PDO 不是一個整體的抽象層,那還有什麼別的原因值得您考慮使用它嗎?
·性能。PDO 從一開始就吸取了現有數據庫擴展成功和失敗的經驗教訓。因為 PDO 的代碼是全新的,所以我們有機會重新開始設計性能,以利用 PHP 5 的最新特性。
·能力。PDO 旨在將常見的數據庫功能作為基礎提供,同時提供對於 RDBMS 獨特功能的方便訪問。
·簡單。PDO 旨在使您能夠輕松使用數據庫。API 不會強行介入您的代碼,同時會清楚地表明每個函數調用的過程。
·運行時可擴展。PDO 擴展是模塊化的,使您能夠在運行時為您的數據庫後端加載驅動程序,而不必重新編譯或重新安裝整個 PHP 程序。例如,PDO_OCI 擴展會替代 PDO 擴展實現 Oracle 數據庫 API。還有一些用於 MySQL、PostgreSQL、ODBC 和 Firebird 的驅動程序,更多的驅動程序尚在開發。
您可能想了解 PDO 與其他常用的抽象層的對比情況,例如 PEAR DB 或 ADODB。無論在 API 方面還是在性能方面,PDO 都比其他常見抽象層要輕型,但是涉及到在各個數據庫後端之間提供統一性方面,則不如那些抽象層,例如用於處理大量可移植性問題的 PEAR MDB 2 抽象層。