PHP 5.3以上版本推薦使用mysqlnd驅動

zybing發表於2021-09-09

什麼是mysqlnd?
mysqldnd(MySQL native driver)是由PHP原始碼提供的mysql驅動連線程式碼。它的目的是代替舊的libmysql驅動。

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

--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql/bin/mysql_config 

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

PDO與mysqlnd, libmysql又是何種關係?
PDO是一個應用層抽象類,底層和MySQL server連線互動需要MySQL驅動的支援。也就是說無論你使用了何種驅動,都可以使用PDO。
PDO是提供了PHP應用程式層API介面,而mysqlnd、libmysql則負責與MySQL server進行網路協議互動(它並不提供php應用程式層API功能)。

為什麼使用mysqlnd驅動?
1. 傳統的PHP訪問MySQL資料庫,是透過MySQL資料庫的libmysql client庫,這個libmysql client是用C/C++編寫的,雖然一直以來PHP透過libmysql訪問資料庫效能也一直很好,但是卻無法利用PHP本身的很多特性。

mysqlnd提供了和Zend引擎高度的整合性,更加快速的執行速度,更少的記憶體消耗,利用了PHP的Stream API,以及客戶段快取機制。由於mysqlnd是透過Zend引擎,因此提供更多高階特性,以及有效利用Zend進行加速,原理圖如下:

從上圖可以看出來,libmysql是直接訪問資料庫的,而mysqlnd是透過Zend訪問資料庫。

2. libmysql驅動是由MySQL AB公司(現在是oracle公司)編寫, 並按MySQL license許可協議釋出,所以在PHP中預設是被禁用的。而mysqlnd是由php官方開發的驅動,以php license許可協議釋出,故就規避了許可協議和版權的問題

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

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

  • 增強的持久連線

  • 引入特有的函式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開始有效)

怎麼安裝mysqlnd驅動?
編譯php時,修改以下幾個項引數即可,提示: 如果使用mysqlnd,並不需要預先安裝mysql

--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 

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

 

延伸:PHP中MySQL、MySQLi和PDO三者的簡單區別
PDO 是官方推薦的,更為通用的資料庫訪問方式,如果你沒有特殊需求,那麼你最好學習和使用 PDO.
但如果你需要使用 MySQL 所特有的高階功能,那麼你可能需要嘗試一下 MySQLi, 因為 PDO 為了能夠同時在多種資料庫上使用,不會包含那些 MySQL 獨有的功能。
MySQLi 是 MySQL 的增強介面,同時提供程式導向和麵向物件介面,也是目前推薦的 MySQL 驅動,舊的C風格 MySQL 介面將會在今後被預設關閉


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2802948/,如需轉載,請註明出處,否則將追究法律責任。

相關文章