2009-09-25 8 views
51

Возможно, это очевидный вопрос, но я хочу быть уверенным.Как узнать, является ли 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 $ 

I» m, используя PDO, и драйвер PDO говорит mysql ...

+1

Да строка "PDO драйвера" говорит "MySQL", но ниже, что он говорит: «Client API версии ** mysqlnd ** 5.0.5- dev - 081106 - $ Редакция: 1.3.2.27 $ "........ – Pacerier

ответ

54

Это должно сделать трюк:

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

Спасибо. Наконец-то вроде Mind –

+2

Похоже, у меня такая же проблема, и когда я пытаюсь использовать функцию getAttribute, я получаю эту ошибку: вызовите функцию-член 'getAttribute()' на не-объект. Похоже, что mysqlnd включен, но я не могу использовать 'get_result()' либо любую идею? –

+0

Эта функция недостаточно надежна, так как она даст ложный отрицательный результат, если сам 'mysqli' даже не доступен. См. Http://stackoverflow.com/a/22499259/632951 для лучшей версии. – Pacerier

8

Во время компиляции выбирается драйвер (libmysql или mysqlnd), и каждый из этих двух может быть определен независимо для mysql, mysqli и pdo_mysql.

Вот три варианта Configure, которые соответствуют 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.

+1

Извините, я не понял ваше последнее предложение. «Установлен драйвер MySQL - и этот компилируется на основе mysqlnd». Это означает, что он использует mysqlnd или нет? BTW Я использую debian, я не хочу компилировать и потерять возможность использовать apt-get –

+0

PDO использует «драйверы»: один для SQLite, один для Postgre, один для mssql, один для MySQL, .. . И для MySQL этот драйвер может быть скомпилирован для использования libmysql или mysqlnd ;; в вашем случае говорится: «mysqlnd» –

+0

@PascalMARTIN, вы говорите, что значение справа от ключа «PDO drivers» (на его выходе phpinfo) никогда не может быть ** mysqli ** и может быть только ** mysql ** (, postgre, sqllite и т. д.)? – Pacerier

2

Может проверить, если these settings существуют? По какой-то причине phpinfo() по-разному отличает их от других настроек ini. Работает на 5.4, не уверен в 5.3.

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

Проверка mysqli_fetch_all реально не описать погоду вы используете mysqlnd. Скорее, он говорит, что у вас включен mysqli extension.

MySQLi - это просто обновленная версия расширения mysql, которая была предоставлена ​​в более ранних версиях PHP.

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 расширение.

Лучший способ проверить MySQLi с mysqlnd против 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 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>'; 
} 
?> 
+0

Неопределенная переменная: предложение в C: \ Dev \ Billing \ checkmysqlnd.php в строке 8 .. либо нужно поместить '$ предложение =" "' сверху, либо иметь первый 'if/else', измененный с'. = 'До '=' .. все еще работает, просто бросает эту ошибку –

+0

Спасибо @ J-Dizzle. это исправлено сейчас :) – timgws

+0

Это отлично сработало! Улучшен форматирование :) – emotality

7

Это то, что я искал

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

'mysqlnd' может быть загружен и не будет использоваться mysql (i)/pdo_mysql – Artefacto