59

当たり前の質問かもしれませんが、確認したいです。

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 と言っています...

4

6 に答える 6

61

警告!この方法は信頼性が低く、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!';
}
于 2009-09-25T08:03:00.237 に答える
43

をチェックし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拡張機能を使用している可能性があることを示唆しています。

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 がドライバとして使用されている場合にのみ機能する 3 つの追加関数を 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>';
}
?>
于 2014-03-19T07:40:13.540 に答える
10

ドライバー (libmysql または mysqlnd) はコンパイル時に選択され、mysql、mysqli、および pdo_mysql に対してこれら 2 つのうちの 1 つを個別に指定できます。

mysqlnd に対応する 3 つの構成オプションは次のとおりです。

  --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 バージョン」は、mysql、mysqli、および pdo_mysql の両方で「mysqlnd 5.0.5-dev」です。

したがって、3 つのケースのいずれかで mysqlnd を使用しているようです。

PDO の場合、MySQL ドライバーがインストールされており、そのドライバーは mysqlnd に基づいてコンパイルされています。

于 2009-09-25T06:43:58.583 に答える
8

これは私が探していたものです

<?php
if (extension_loaded('mysqlnd')) {
}
?>
于 2015-10-16T02:08:48.317 に答える
3

これらの設定が存在するかどうかを確認してください。phpinfo() は、何らかの理由で他の ini 設定とは異なる方法でレンダリングします。5.4 で動作しますが、5.3 については不明です。

ini_get('mysqlnd.debug') !== false
于 2013-07-26T16:31:01.577 に答える
1

最初の phpinfo() には、PHP のコンパイルに使用される「構成コマンド」がリストされています。

彼らが他の回答で述べているように、mysqlndは、phpのインストール/コンパイルプロセス中の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の詳細については

(私はこれがかなり古いことを知っていますが、この知識があれば技術サポートの議論に何時間も費やす必要がなく、私はこれを最初に見ました。)

于 2019-01-16T08:30:37.850 に答える