如何知道MySQLnd是否是主动驱动程序?

时间:2009-09-25 06:20:55

标签: php mysql mysqlnd

也许这是一个显而易见的问题,但我想确定。

我怎么知道MySQLnd是否是主动驱动程序?

我正在运行PHP 5.3和MySQL 5.1.37。 在phpinfo()中列出了mysqlnd,但只有这个我不能确定我是否使用MySQLnd或旧驱动程序......

phpinfo()输出的摘录

mysql
MySQL Support   enabled
Active Persistent Links     0
Active Links    0
Client API version  mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

mysqli
MysqlI Support  enabled
Client API library version  mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $
Active Persistent Links     0
Inactive Persistent Links   0
Active Links    26 

mysqlnd
mysqlnd enabled
Version     mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

PDO
PDO support enabled
PDO drivers     mysql

pdo_mysql
PDO Driver for MySQL    enabled
Client API version  mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

我正在使用PDO,PDO驱动程序说mysql ...

6 个答案:

答案 0 :(得分:60)

这应该可以解决问题:

<?php
$mysqlnd = function_exists('mysqli_fetch_all');

if ($mysqlnd) {
    echo 'mysqlnd enabled!';
}

要检测它是否是活动的PDO驱动程序,请创建MySQL PDO对象:

if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) {
    echo 'PDO MySQLnd enabled!';
}

答案 1 :(得分:32)

检查mysqli_fetch_all并不能真正描述您使用mysqlnd。相反,它表示您已启用mysqli extension

MySQLi只是早期版本的PHP中提供的mysql扩展的更新版本。

  

mysql扩展程序,mysqli扩展程序和PDO MySQL driver都可以单独配置为使用   libmysqlclient或mysqlnd

此代码:

<?php
$mysqlnd = function_exists('mysqli_fetch_all');

if ($mysqlnd) {
    echo 'mysqlnd enabled!';
}

没有回应没有任何暗示你没有编译/启用/安装mysqli,并且可能正在使用较早的mysql扩展名。

使用libmysqlclient通过mysqlnd vs mysql检查mysqli的更好方法是:

<?php
if (function_exists('mysql_connect')) {
    echo "- MySQL <b>is installed</b>.<br>";
} else  {
    echo "- MySQL <b>is not</b> installed.<br>";
}

if (function_exists('mysqli_connect')) {
    echo "- MySQLi <b>is installed</b>.<br>";
} else {
    echo "- MySQLi <b>is not installed</b>.<br>";
}

if (function_exists('mysqli_get_client_stats')) {
    echo "- MySQLnd driver is being used.<br>";
} else {
    echo "- libmysqlclient driver is being used.<br>";
}

这是因为mysqlnd provides three additional functions that work only when mysqlnd is used as the driver

最后,PDO检查需要首先定义$pdo变量。

$dbHost = "localhost";
$dbUser = "root";
$dbPass = "password";
$dbName = "database";

$pdo = new PDO('mysql:host='.$dbHost.';dbname='.$dbName, $dbUser, $dbPass);
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) {
    echo '- PDO MySQLnd <b>is enabled</b>.<br>';
} else {
    echo '- PDO MySQLnd <b>is not enabled</b>.<br>';
}
?>

答案 2 :(得分:9)

在编译时选择驱动程序(libmysql或mysqlnd),并且可以为mysql,mysqli和pdo_mysql单独指定这两个驱动程序中的每一个。

以下是与mysqlnd对应的三个配置选项:

  --with-mysql[=DIR]      Include MySQL support.  DIR is the MySQL base
                          directory.  If mysqlnd is passed as DIR,
                          the MySQL native driver will be used [/usr/local]
  --with-mysqli[=FILE]    Include MySQLi support.  FILE is the path
                          to mysql_config.  If mysqlnd is passed as FILE,
                          the MySQL native driver will be used [mysql_config]
  --with-pdo-mysql[=DIR]    PDO: MySQL support. DIR is the MySQL base directoy
                                 If mysqlnd is passed as DIR, the MySQL native
                                 native driver will be used [/usr/local]


在您的情况下,mysql,mysqli和pdo_mysql的“客户端API版本”是“mysqlnd 5.0.5-dev”。

所以看起来你在三种情况下都使用了mysqlnd。

对于PDO,您安装了MySQL驱动程序 - 并且该驱动程序是基于mysqlnd编译的。

答案 3 :(得分:9)

这就是我要找的东西

<?php
if (extension_loaded('mysqlnd')) {
}
?>

答案 4 :(得分:3)

也许检查these settings是否存在?由于某种原因,phpinfo()以不同于其他ini设置的方式呈现它们。适用于5.4,不确定5.3。

ini_get('mysqlnd.debug') !== false

答案 5 :(得分:1)

phpinfo()开头列出了用于编译PHP的“配置命令”。

正如他们在其他答案中指出的那样,在php安装/编译过程中,mysqlnd是2个选择中的1个(默认值)。

我的7.0.33版phpinfo配置命令为:

'./ configure''--prefix = / opt / php70''--with-libdir = lib64''--enable-bcmath''--enable-calendar''--enable-dbase''- -enable-exif''--enable-ftp''--enable-gd-native-ttf''--enable-intl''--enable-libxml''--enable-mbstring''--enable-pdo ''--enable-soap''--enable-sockets''--enable-sqlite-utf8''--enable-wddx''--enable-zip''--with-bz2''--with- curl''--with-freetype-dir''--with-gd''--with-gettext''--with-gmp''--with-imap''--with-imap-ssl''- -with-jpeg-dir = / usr''--with-kerberos''--with-mcrypt''--with-mhash''--with-mssql''--with-mysql = / usr''- -with-mysql-sock = / var / lib / mysql / mysql.sock''--with-mysqli = / usr / bin / mysql_config''--with-openssl''--with-pdo-mysql = / usr ''--with-pdo-pgsql = / usr''--with-pgsql = / usr''--with-pdo-sqlite''--with-png-dir''--with-pspell''- -with-sqlite''--with-system-tzdata''--with-tidy''--with-unixODBC''--with-xmlrpc''--with-xsl''--with-zlib'< / p>

注意--with-mysqli = / usr / bin / mysql_config''

和--enable-mysqlnd''(不在此版本中,而是对5.6 php构建的读取)

-with-mysqli =指向一个目录,表示它正在使用libmysqlclient 如果它是mysqlnd,那么它正在使用本机驱动程序。

有关此http://php.net/manual/en/mysqlinfo.library.choosing.php

的更多信息

(我知道这已经太老了,但是这种知识可以为我节省数小时的技术支持辩论,而我首先看到了这一点。)