【问题标题】:How to know if MySQLnd is the active driver?如何知道 MySQLnd 是否是活动驱动程序?
【发布时间】:2010-12-01 08:01:23
【问题描述】:

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

如何知道 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...

【问题讨论】:

  • 是的,“PDO 驱动程序”行显示“mysql”,但在其下方显示“客户端 API 版本 mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3。 2.27 $"........

标签: php mysql mysqlnd


【解决方案1】:

警告!此方法不可靠,自 PHP 8.1 起无效

如果您通过mysqli 访问,这应该可以解决问题:

<?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!';
}

【讨论】:

  • 看起来我遇到了类似的问题,当我尝试使用 getAttribute 函数时出现此错误:调用非对象上的成员函数getAttribute()。似乎mysqlnd已启用,但我也不能使用get_result(),知道吗?
  • 这个函数不够健壮,因为如果mysqli 本身甚至不可用,它就会给出假阴性。请参阅stackoverflow.com/a/22499259/632951 以获得更好的版本。
  • @Inspire,另一个可能的问题当然是,即使您没有 mysqlnd,其他人也定义了该函数。那么你会得到一个误报。
  • @cookinggood 变量$pdo 必须是PDO 的实例。也就是说,您必须首先为其分配new PDO(...)
  • 这是错误的。正如@Tim-Groeneveld 建议的那样,检查mysqlnd 特定功能。
【解决方案2】:

检查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 扩展。

使用 mysqlnd 检查 mysqli 与使用 libmysqlclient 的 mysql 的更好方法是这样做:

<?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>';
}
?>

【讨论】:

  • 未定义变量:第 8 行 C:\Dev\Billing\checkmysqlnd.php 中的语句 .. 要么需要将 $sentence = "" 放在顶部,要么将第一个 if / else.= 更改为= .. 仍然有效,只是抛出了那个错误
  • Re “检查 mysqli_fetch_all 并不能真正描述您是否使用 mysqlnd ..”。实际上mysqli-fetch-all doc 明确表示“仅限 MySQL 本机驱动程序.. 仅适用于 mysqlnd”。我读到说检查mysqli_fetch_all 确实描述了您是否使用mysqlnd。
  • ... 虽然进一步阅读您的答案,但我意识到(任何 mysqli 检查)只会告诉我们 mysqli 是否正在使用mysqlnd ;对于PDO,这是您答案的最后一部分。谢谢。
【解决方案3】:

驱动程序(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 编译的。

【讨论】:

  • 对不起,我没听懂你的最后一句话。 “安装了 MySQL 驱动程序——并且该驱动程序是基于 mysqlnd 编译的。”这意味着它是否使用mysqlnd?顺便说一句,我正在使用 debian,我不想编译并失去使用 apt-get 的可能性
  • PDO 正在使用“驱动程序”:一个用于 SQLite,一个用于 Postgre,一个用于 mssql,一个用于 MySQL,... 而且,对于 MySQL,该驱动程序可以编译为使用 libmysql 或 mysqlnd ;;在你的情况下,它说“mysqlnd”
  • @PascalMARTIN,你是说键 PDO drivers 右边的值(在他的 phpinfo 输出中)永远不能是 mysqli,只能是 mysql(、postgre、sqllite 等)?
  • @Pacerier - 鉴于PDOmysqli替代品,那肯定是这样的; “建立在mysqli上的PDO”没有意义,对吧?
【解决方案4】:

这就是我要找的东西

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

【讨论】:

  • mysqlnd 可能已加载但未被 mysql(i)/pdo_mysql 使用
【解决方案5】:

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

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

【讨论】:

  • 如果安装了mysqlnd,它将返回空的string(0) "",但可能没有激活(PHP8.0)
【解决方案6】:

开头的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'

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

和 --enable-mysqlnd' ' (不在这一个中,而是在 5.6 php 版本上的读数)

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

有关此http://php.net/manual/en/mysqlinfo.library.choosing.php的更多信息

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

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2012-05-25
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多