1. 程式人生 > >PHP連線Mysql常用API(mysql,mysqli,pdo)區別與聯絡

PHP連線Mysql常用API(mysql,mysqli,pdo)區別與聯絡

什麼是API?

一個應用程式介面(Application Programming Interface的縮寫),定義了類,方法,函式,變數等等一切 你的應用程式中為了完成特定任務而需要呼叫的內容。在PHP應用程式需要和資料庫進行互動的時候所需要的API 通常是通過PHP擴充套件暴露出來(給終端PHP程式設計師呼叫)。

API可以是面向過程的,也可以是面向物件的。對於面向過程的API,我們通過呼叫函式來完成任務,而對於面向物件的API, 我們例項化類,並在例項化後得到的物件上呼叫方法。對於這兩種介面而言,後者通常是首選的,因為它更加現代化,並且 給我們帶來了良好的程式碼結構。

當構建一個需要連線到MySQL服務端的PHP應用的時候,有好幾種API可供選擇。此文件就是討論這些可用的API並討論如何為 你的應用選擇一個最佳的解決方案。

什麼是聯結器?

在MySQL文件中,術語connector解釋為“一段允許你的應用連線到MySQL資料庫伺服器的軟體程式碼”。 MySQL提供了很多語言的聯結器,其中包括PHP的。

在你的PHP應用需要和一個數據庫伺服器互動的時候,你需要書寫PHP程式碼去完成“連線資料庫伺服器”,“查詢資料庫“以及其他資料庫相關功能 等一系列活動。你的PHP應用將會使用提供這些API的軟體,或者在需要的時候使用一些中間庫,來處理你的應用和資料庫伺服器之間的互動。 這種軟體通常被認為是聯結器,它允許你的引用連線到資料庫伺服器。

什麼是驅動?

驅動是一段設計用來於一種特定型別的資料庫伺服器進行互動的軟體程式碼。驅動可能會呼叫一些庫,比如MySQL客戶端庫或者MySQL Native驅動庫。 這些庫實現了用於和MySQL資料庫伺服器進行互動的底層協議。

通過一個例子php.net/manual/zh/mysqli.overview.php#mysqli.overview.pdo” style=”COLOR: rgb(0,0,153); BACKGROUND-COLOR: transparent”>PDO(PHP Database Object的縮寫)資料庫抽象層可以 使用多種特定資料庫的驅動。其中一種驅動就是PDO MYSQL驅動,它就是與MySQL伺服器之間的介面。

有時大家會不加區分的使用聯結器和驅動這兩個術語。在MySQL相關文件中”driver”術語被作為一個聯結器包 中提供特定資料庫部分的軟體程式碼。

什麼是擴充套件?

在PHP文件中你還會發現很多其他的擴充套件。PHP程式碼是由一個核心,一些可選擴充套件組成了核心功能。PHP 的MySQL相關擴充套件,比如mysqli,mysql都是基於PHP擴充套件框架實現的。

擴充套件一個典型的作用就是暴露一個API給PHP程式設計師,允許擴充套件自己的功能可以被程式設計師使用。當然,也有一部分基於PHP擴充套件框架 開發的擴充套件不會給PHP程式設計師暴露API介面。

比如說PDO MySQL驅動擴充套件,就沒有向PHP程式設計師暴露API介面,但是向它上層的PDO層提供了一個介面。

術語API和擴充套件描述的不是同一類事物,因為擴充套件可能並不需要暴露一個API介面給程式設計師。

PHP中提供的用於MySQL的主要API是什麼?

當考慮連線到MySQL資料庫伺服器的時候,有三種主要的API可供選擇:

PHP的MySQL擴充套件

PHP的mysqli擴充套件

PHP資料物件(PDO)

三者都有各自的優缺點。下面的討論就是為了對每種API的關鍵方面給出一個簡短的介紹。

什麼是PHP的MySQL擴充套件?

這是設計開發允許PHP應用與MySQL資料庫互動的早期擴充套件。mysql擴充套件提供了一個面向過程 的介面,並且是針對MySQL4.1.3或更早版本設計的。因此,這個擴充套件雖然可以與MySQL4.1.3或更新的資料庫服務端 進行互動,但並不支援後期MySQL服務端提供的一些特性。

Note:如果你是使用MySQL4.1.3或更新的服務端版本,強烈建議你使用mysqli 擴充套件替代它。

mysql擴充套件的原始碼在PHP擴充套件目錄ext/mysql下。

對於mysql擴充套件的更多資訊,請參閱MySQL。

什麼是PHP的mysqli擴充套件?

mysqli擴充套件,我們有時稱之為MySQL增強擴充套件,可以用於使用 MySQL4.1.3或更新版本中新的高階特性。mysqli擴充套件在PHP 5及以後版本中包含。

mysqli擴充套件有一系列的優勢,相對於mysql擴充套件的提升主要有:

面向物件介面

prepared語句支援(譯註:關於prepare請參閱mysql相關文件)

多語句執行支援

事務支援

增強的除錯能力

嵌入式服務支援

Note:如果你使用MySQL4.1.3或更新版本,強烈建議你使用這個擴充套件。

在提供了面向物件介面的同時也提供了一個面向過程的介面。

mysqli擴充套件是使用PHP擴充套件框架構建的,它的原始碼在PHP原始碼目錄下的ext/mysqli中。

對於mysqli擴充套件的更多資訊,請參閱Mysqli。

什麼是PDO?

PHP資料物件,是PHP應用中的一個數據庫抽象層規範。PDO提供了一個統一的API介面可以使得你的PHP應用不去關心具體要 連線的資料庫伺服器系統型別。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換資料庫伺服器,比如從Firebird 到MySQL,僅僅需要修改很少的PHP程式碼。

其他資料庫抽象層的例子包括Java應用中的JDBC以及Perl中的DBI。

當然,PDO也有它自己的先進性,比如一個乾淨的,簡單的,可移植的API,它最主要的缺點是會限制讓你不能使用 後期MySQL服務端提供所有的資料庫高階特性。比如,PDO不允許使用MySQL支援的多語句執行。

PDO是基於PHP擴充套件框架實現的,它的原始碼在PHP原始碼目錄的ext/pdo下。

PDO的更多資訊,請參閱PDO。

什麼是PDO的MySQL驅動器?

PDO的MySQL驅動並不是一套API,至少從PHP程式設計師的角度來看是這樣的。實際上,PDO的MySQL驅動處於PDO自己的下層, 提供了特定的Mysql功能。程式設計師直接呼叫PDO的API,而PDO使用了PDO的MySQL驅動完成與MySQL伺服器端的互動。

PDO的MySQL驅動是眾多PDO驅動中的一個。其他可用的PDO驅動包括Firebird,PostgreSQL等等。

PDO的MySQL驅動是基於PHP擴充套件框架實現的。它的原始碼在PHP原始碼目錄下的ext/pdo_mysql。 它沒有向PHP程式設計師暴露API。

PDO的MySQL擴充套件的更多資訊請參閱MySQL (PDO)。

什麼是PHP的MySQL Native 驅動?

為了與MySQL資料庫服務端進行互動,mysql擴充套件,mysqli擴充套件, PDO MySQL驅動都使用了實現了必要的協議的底層庫。以前,可用的庫只有MySQL客戶端庫和libmysql。

然而,libmysql包含的介面沒有針對與PHP的應用互動進行優化,libmysql 是早期為C應用程式設計的。基於這個原因,MySQL Native驅動mysqlnd,作為libmysql的一個 針對PHP應用的修改版本被開發。

mysql,mysqli以及PDO Mysql驅動都可以各自配置使用 libmysql或者mysqlnd。mysqlnd作為一個專門設計 用於PHP系統的庫,它在記憶體和速度上都比libmysql有很大提升。非常希望你去嘗試這些提升。

Note:MySQL Native驅動僅僅可以在MySQL服務端版本為4.1.3及以後版本才可以使用。

MySQL Native驅動是基於PHP擴充套件框架實現的。原始碼位於PHP原始碼目錄的ext/mysqlnd下。 它沒有向PHP程式設計師暴露介面。

以上的總結,如圖:

Other Message

1.什麼是mysqlnd驅動?

PHP手冊上的描述:

MySQL Native Driver is a replacement for the MySQL Client Library (libmysql). 

MySQL Native Driver is part of the official PHP sources as of PHP 5.3.0. 

mysqldnd即mysql native driver簡寫,即是由PHP原始碼提供的mysql驅動連線程式碼.它的目的是代替舊的libmysql驅動.

傳統的安裝php的方式中,我們在編譯PHP時,一般需要指定以下幾項:

--with-mysql=/usr/local/mysql 

--with-pdo-mysql=/usr/local/mysql

這實際上就是使用了mysql官方自帶的libmysql驅動, 這是比較老的驅動, PHP 5.3開始已經不建議使用它了, 而建議使用mysqlnd.

2. PDO與mysqlnd, libmysql又是何種關係?

PDO是一個應用層抽象類,底層和mysql server連線互動需要mysql驅動的支援. 也就是說無論你使用了何種驅動,都可以使用PDO.

PDO是提供了PHP應用程式層API介面,而mysqlnd, libmysql則負責與mysql server進行網路協議互動(它並不提供php應用程式層API功能)

3. 為何要使用mysqlnd驅動?

PHP官方手冊描述:

A.libmysql驅動是由mysql AB公司(現在是oracle公司)編寫, 並按mysql license許可協議釋出,所以在PHP中預設是被禁用的.

而mysqlnd是由php官方開發的驅動,以php license許可協議釋出,故就規避了許可協議和版權的問題

B.因為mysqlnd內置於PHP原始碼,故你在編譯安裝php時就不需要預先安裝mysql server也可以提供mysql client API (mysql_connect, pdo , mysqli), 這將減化一些工作量.

C. mysqlnd是專門為php優化編寫的驅動,它使用了PHP本身的特性,在記憶體管理,效能上比libmysql更有優勢. php官方的測試是:libmysql將每條記錄在記憶體中儲存了兩份,而mysqlnd只儲存了一份

D. 一些新的或增強的功能

增強的持久連線

引入特有的函式mysqli_fetch_all()

引入一些效能統計函式mysqli_get_cache_stats(), mysqli_get_client_stats(), 

mysqli_get_connection_stats(),

使用上述函式,可很容易分析mysql查詢的效能瓶頸!

SSL支援(從php 5.3.3開始有效)

壓縮協議支援

命名管道支援(php 5.4.0開始有效)

**4. 如何使用mysqlnd驅動(**提示: 如果使用mysqlnd,並不需要預先安裝mysql)

編譯php時,修改以下幾個項引數即可

--with-mysql=mysqlnd \

--with-mysqli=mysqlnd \

--with-pdo-mysql=mysqlnd 

驗證:如果在phpinfo輸出的mysql項中發現 client API Version  : mysqlnd, 說明mysqlnd驅動安裝成功.

另外,附一個可用於生產環境的php的編譯引數列表

./configure --prefix=/usr/local/php \

--with-mysql=mysqlnd \

--with-mysqli=mysqlnd \

--with-pdo-mysql=mysqlnd

--with-iconv-dir \

--with-freetype-dir \

--with-jpeg-dir \

--with-png-dir \

--with-zlib \

--with-libxml-dir \

--enable-xml \

--disable-rpath \

--enable-bcmath \

--enable-shmop \

--enable-sysvsem \

--enable-inline-optimization \

--with-curl \

--with-mcrypt \

--with-curlwrappers \

--enable-mbregex \

--enable-fpm \

--enable-mbstring \

--with-gd \

--enable-gd-native-ttf \

--with-openssl \

--with-mhash \

--enable-pcntl \

--enable-sockets \

--with-xmlrpc \

--enable-zip \

--enable-soap \

--without-pear