2009-09-25 14 views
51

Quizás sea una pregunta obvia, pero quiero estar seguro.¿Cómo saber si MySQLnd es el controlador activo?

¿Cómo puedo saber si MySQLnd es el controlador activo?

Estoy ejecutando PHP 5.3 y MySQL 5.1.37. En phpinfo() mysqlnd aparece pero sólo con esto no puede estar seguro de si estoy usando mysqlnd o el controlador antiguo ...

Extracto de phpinfo() de salida

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 usando PDO, y el controlador PDO dice mysql ...

+1

Si la fila "DOP conductores" dice "mysql", pero por debajo que dice "versión de la API de cliente ** ** mysqlnd 5.0.5- dev - 081106 - $ Revisión: 1.3.2.27 $ "........ – Pacerier

Respuesta

54

Esto debe hacer el truco:

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

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

para detectar si el conductor DOP su activo, crear el objeto de MySQL DOP a continuación:

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

Gracias. Finalmente algo de Tranquilidad –

+2

Parece que estoy teniendo un problema similar y cuando trato de usar la función getAttribute obtengo este error: Llamar a una función miembro 'getAttribute()' en un objeto no. Parece que mysqlnd está habilitado pero no puedo usar 'get_result()' tampoco, ¿alguna idea? –

+0

Esta función no es lo suficientemente robusta ya que dará un falso negativo si 'mysqli' en sí mismo no está disponible. Ver http://stackoverflow.com/a/22499259/632951 para una mejor versión. – Pacerier

8

El controlador (libmysql o mysqlnd) se elige en tiempo de compilación, y cada uno de esos dos se puede especificar de forma independiente para mysql, mysqli y pdo_mysql.

Estas son las tres opciones de configuración que corresponden a 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] 


En su caso, la "versión de la API de cliente" es "mysqlnd 5.0.5-dev" tanto para mysql, mysqli, y pdo_mysql.

Parece que estás usando mysqlnd en cualquiera de los tres casos.

En el caso de PDO, tiene instalado el controlador MySQL, y ese se compila en base a mysqlnd.

+1

Lo siento, no entendí tu última oración. "Controlador MySQL instalado, y ese está compilado en base a mysqlnd". Significa que está usando mysqlnd o no? BTW Estoy usando debian, no quiero compilar y pierdo la posibilidad de usar apt-get –

+0

PDO usa "drivers": uno para SQLite, uno para Postgre, uno para mssql, uno para MySQL, ... . Y, para MySQL, ese controlador se puede compilar para usar ya sea libmysql o mysqlnd ;; en su caso, dice "mysqlnd" –

+0

@PascalMARTIN, ¿Está diciendo que el valor a la derecha de la clave 'PDO drivers' (en su salida phpinfo) nunca puede ser ** mysqli ** y solo puede ser ** mysql ** (, postgre, sqllite, etc.)? – Pacerier

2

comprobar Tal vez si these settings existen? phpinfo() los representa de manera diferente a otras configuraciones ini por alguna razón. Funciona para 5.4, no estoy seguro de 5.3.

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

Comprobación de mysqli_fetch_all en realidad no se describa asegurar que está utilizando mysqlnd. Más bien, dice que tiene habilitado el mysqli extension.

MySQLi es simplemente una versión actualizada de la extensión mysql que se proporcionó en versiones anteriores de PHP.

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

este código:

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

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

no haciéndose eco de nada sugiere que usted no tiene mysqli compilado/activado/instalado, y que esté utilizando la mayor extensión mysql.

Una mejor manera de comprobar si hay mysqli con mysqlnd vs MySQL con libmysqlclient es hacer esto:

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

Esto funciona porque mysqlnd provides three additional functions that work only when mysqlnd is used as the driver.

Finalmente, la verificación de PDO debe tener la variable $pdo definida primero.

$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

Variable indefinida: oración en C: \ Dev \ Billing \ checkmysqlnd.php en la línea 8 ... o bien debe poner '$ sentence =" "' en la parte superior o tener el primer 'if/else' cambiado de'. = 'A '=' .. todavía funciona simplemente arroja ese error –

+0

Gracias @ J-Dizzle. esto está arreglado ahora :) – timgws

+0

Esto funcionó perfectamente gracias! Mejorado el formato :) – emotality

7

Esto es lo que estaba buscando

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

'mysqlnd' puede ser cargado y aún no ser utilizado por mysql (i)/pdo_mysql – Artefacto

Cuestiones relacionadas