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

更新时间:2024-05-09 下载TXT文档 下载Word文档

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

我怎么知道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-$修订:1.3.2.27 $" ...

这应该可以解决问题:

<?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特定功能。

检查mysqli_fetch_all并不能真正说明您是否正在使用mysqlnd。而是说您已启用mysqli扩展名。

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

The mysql extension, the mysqli extension and the PDO MySQL driver can each be individually configured to use either
libmysqlclient or mysqlnd

这段代码:

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

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

不回声没有暗示您没有编译/启用/安装mysqli,并且可能正在使用旧的mysql扩展名。

用mysqlnd与mysql和libmysqlclient检查mysqli的更好方法是执行以下操作:

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

if (function_exists('mysqli_connect')) {
    echo"- MySQLi is installed.";
} else {
    echo"- MySQLi is not installed.";
}

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

之所以可行,是因为mysqlnd提供了三个附加功能,这些功能仅在将mysqlnd用作驱动程序时才起作用。

(短码网-duanma.net)

最后,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 is enabled.';
} else {
    echo '- PDO MySQLnd is not enabled.';
}
?>
  • 未定义的变量:第8行的C:\ Dev \ Billing \ checkmysqlnd.php中的句子..需要将$sentence =""放在顶部,或者将第一个if else.=更改为= ..仍然有效抛出那个错误
  • 谢谢@ J-Dizzle。现在已经解决了:)
  • 这工作得很好,谢谢!改进的格式:)

这就是我想要的

<?php
if (extension_loaded('mysqlnd')) {
}
?>
  • mysqlnd可能已加载,但尚未被mysql(i)/ pdo_mysql使用

在编译时选择驱动程序(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等)?

也许检查这些设置是否存在?出于某些原因,phpinfo()使它们与其他ini设置有所不同。适用于5.4,不确定5.3。

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

开头的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的更多信息

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

以上就是短码网小编为大家整理的《php 如何知道MySQLnd是否是活动驱动程序?》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

php 如何知道MySQLnd是否是活动驱动程序?》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/4320c2de265.html

回到顶部