Как узнать, является ли 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...
Ответы
Ответ 1
Это должно сделать трюк:
<?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!';
}
Ответ 2
Проверка на mysqli_fetch_all
не описывает, как вы используете mysqlnd
. Скорее, он говорит, что у вас включено расширение mysqli.
MySQLi - это просто обновленная версия расширения mysql
, которая была предоставлена в более ранних версиях PHP.
Расширение mysql
, расширение mysqli
и PDO MySQL driver
могут быть индивидуально настроены для использования либо libmysqlclient или mysqlnd
Этот код:
<?php
$mysqlnd = function_exists('mysqli_fetch_all');
if ($mysqlnd) {
echo 'mysqlnd enabled!';
}
не повторяя ничего, не указывает на то, что у вас нет mysqli, скомпилированного/включенного/установленного, и может использовать более старое расширение mysql
.
Лучший способ проверить mysqli с mysqlnd vs mysql с помощью libmysqlclient - сделать это:
<?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 предоставляет три дополнительные функции, которые работают только тогда, когда mysqlnd используется как драйвер.
Наконец, для проверки 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>';
}
?>
Ответ 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]
В вашем случае "версия клиентского API" является "mysqlnd 5.0.5-dev" для mysql, mysqli и pdo_mysql.
Итак, кажется, вы используете mysqlnd в трех случаях.
В случае PDO у вас установлен драйвер MySQL, и этот файл скомпилирован на основе mysqlnd.
Ответ 4
Это то, что я искал
<?php
if (extension_loaded('mysqlnd')) {
}
?>
Ответ 5
Возможно, проверьте, существуют ли эти параметры? По какой-то причине phpinfo() по-разному отличает их от других настроек ini. Работает на 5.4, не уверен в 5.3.
ini_get('mysqlnd.debug') !== false
Ответ 6
phpinfo() в начале перечисляет "команду Configure", используемую для компиляции PHP.
Как указано в других ответах, mysqlnd имеет значение 1 (по умолчанию) из 2 вариантов во время процесса установки/компиляции php.
Моя команда конфигурирования phpinfo для 7.0.33:
'./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
(Я знаю, что это уже давно, но это знание спасло бы меня от долгих споров по технической поддержке, и я увидел это первым.)