mysqlnd 以及 libmysqlclient

1. PHP拓展

1.1 PHP核心

PHP的核心是由兩個獨立的部分組成的。 php

在最底層是Zend Engine (ZE)。ZE 負責把人類能夠理解的腳本解析成機器能夠理解的符號(token),而後在一個進程空間內執行這些符號。ZE還負責內存管理,變量做用域,以及函數調用的調度。 mysql

另外一部分是PHP。PHP負責與SAPI層(Server Application Programming Interface,常常被用來與Apache, IIS, CLI, CGI等host環境進行關聯)的交互以及綁定。它也爲safemode和openbasedir檢查提供了一個統一的控制層,就像streams層把文件和網絡I/O與用戶空間函數(例如fopen(),fread()和fwrite())關聯起來同樣。 sql

1.2 拓展形式

  • PEAR。PEAR是PHP擴展與應用庫(the PHP Extension and Application Repository)的縮寫。它是一個PHP擴展及應用的一個代碼倉庫,簡單地說,PEAR就是PHP的CPAN(Perl第三方代碼庫)。 數據庫

  • PECL。PECL(PHP Extension Community Library),PHP的擴展庫,它提供了一系列已知的擴展庫,由C++等其餘語言編寫而成,以.so形式出現,.so 爲共享庫,是shared object,用於動態鏈接的,和dll差很少,爲比PEAR更快,可是與PEAR不一樣的是,PECL須要在服務器上配置並被註冊到主機中。 api

最直接的表述:Pear是PHP的上層擴展,Pecl是PHP的底層擴展。 服務器

2. MYSQL拓展

2.1 如何訪問MYSQL數據庫

可使用的PHP拓展有這麼幾個: 網絡

  1. mysql
  2. mysqli
  3. pdo

其中由於mysql是面向過程的,並且沒法使用新版本MySQL帶來的一些高級特性,如今已經不推薦使用。推薦使用mysqli以及pdo拓展。 函數

可是這三種數據庫訪問方式,在PHP拓展的角度上看,仍是比較上層的拓展,依賴更底層的庫去鏈接和訪問數據庫。 性能

底層的庫,咱們目前有這麼兩個: 優化

  1. libmysqlclient
  2. mysqlnd

可是決定使用這兩個庫中的那一個,是PHP語言編譯時的決定,一旦PHP編譯完成之後,要更改估計比較困難(我沒有嘗試過,所以不太確定)。

2.2 libmysqlclient

這是一個根據 MySQL client/server 協議,使用C語言實現的庫。有不少的客戶端api使用libmysqlclient這個庫去和MySQL Server進行通訊(Exceptions are except Connector/J and Connector/Net.)。

2.3 mysqlnd

MySQL Native Driver實現和libmysqlclient一樣的功能。但MySQL Native Driver是PHP 5.3.0 官方的代碼。

mysqlnd 和 libmysqlclient最大的不一樣是,mysqlnd 針對與PHP的應用交互進行優化,而libmysqlclient是早期爲C應用程序設計的,並無針對性的優化。

另外,mysqlnd 能夠支持不少高級的特性,好比prepared語句支持(曾經在這個prepare的問題上被坑過,當時用的正是libmysqlclient)。

2.4 性能對比

更加詳細的對比,移步博文Benchmark: libmysql vs mysqlnd

相關文章
相關標籤/搜索