前兩天在一個php腳本中使用mysqli_fetch_all()來獲取所有結果集,但卻提示該方法undefined,只好退回,使用mysql_fetch_row()這個方法,一行一行的獲取記錄,效率很慢。後來查詢獲得:php
1, mysqli_fetch_all()這個函數只存在於mysqlnd中,也就是PHP的原生MySQL驅動中。mysql
2, 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. (mysqlnd是libmysql的一個替代,mysqlnd是從PHP5.3.0版本以後,官方PHP資源的一部分)。libmysql驅動是比較老的驅動,PHP 5.3開始已經不建議使用它了,而建議使用mysqlnd。sql
3,傳統的安裝php的方式中,咱們在編譯PHP時,通常須要指定如下幾項:bash
--with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql
這實際上就是使用了mysql官方自帶的libmysql驅動, 這是比較老的驅動, PHP 5.3開始已經不建議使用它了, 而建議使用mysqlnd.oracle
4, 爲什麼要使用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開始有效);fetch
5,如何使用mysqlnd驅動?編譯php時,修改如下幾個項參數便可:優化
--with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd
提示: 若是使用mysqlnd,並不須要預先安裝mysql。
驗證:若是在phpinfo()輸出的mysql項中發現 client API Version:mysqlnd, 說明mysqlnd驅動安裝成功。