Mysqlnd
PHP Manual

実行時設定

php.ini の設定により動作が変化します。

MySQL Native Driver 設定オプション
名前 デフォルト 変更可能 変更履歴
mysqlnd.collect_statistics "1" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.collect_memory_statistics "0" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.debug "" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.log_mask 0 PHP_INI_ALL PHP 5.3.0 以降で利用可能。
mysqlnd.mempool_default_size 16000 PHP_INI_ALL PHP 5.3.3 以降で利用可能。
mysqlnd.net_read_timeout "31536000" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.net_cmd_buffer_size 5.3.0 - "2048", 5.3.1 - "4096" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.net_read_buffer_size "32768" PHP_INI_SYSTEM PHP 5.3.0 以降で利用可能。
mysqlnd.sha256_server_public_key "" PHP_INI_PERDIR PHP 5.5.0 以降で利用可能。
mysqlnd.fetch_data_copy 0 PHP_INI_ALL PHP 5.6.0 以降で利用可能。
PHP_INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。

以下に設定ディレクティブに関する 簡単な説明を示します。

mysqlnd.collect_statistics boolean

さまざまなクライアント統計情報の収集を有効にします。収集した情報には mysqli_get_client_stats()mysqli_get_connection_stats()mysqli_get_cache_stats() でアクセスでき、 phpinfo() 関数の出力の mysqlnd セクションにも表示されます。

この設定項目は、メモリ管理に関するもの以外のすべての MySQL Native Driver 統計情報 を有効にします。

mysqlnd.collect_memory_statistics boolean

さまざまなメモリ統計情報の収集を有効にします。収集した情報には mysqli_get_client_stats()mysqli_get_connection_stats()mysqli_get_cache_stats() でアクセスでき、 phpinfo() 関数の出力の mysqlnd セクションにも表示されます。

この設定項目は、MySQL Native Driver 統計情報 全体の中でメモリ管理に関する統計を有効にします。

mysqlnd.debug string

mysqlnd を使うすべての拡張モジュールからの通信を、指定したログファイルに記録します。

この項目の書式は mysqlnd.debug = "option1[,parameter_option1][:option2[,parameter_option2]]" となります。

書式文字列のオプションは、次のとおりです。

  • A[,file] - トレース出力を指定したファイルに追記します。 また、データの追記はデータベースへの書き込みのたびに発生することを保証します。 それを実現するために、トレースファイルをいったん閉じてから開きなおします (速度は遅くなります)。 これで、アプリケーションがクラッシュしたときにも完全なログファイルを残せます。

  • a[,file] - トレース出力を指定したファイルに追記します。

  • d - DBUG_<N> マクロからの、現在の状態に関する出力を有効にします。 キーワードのリストが後に続くことがあり、その場合は 指定したキーワードの DBUG マクロからだけ出力させます。 空のキーワードリストを指定すると、すべてのマクロを出力します。

  • f[,functions] - デバッガの動作を、リストで指定した関数だけに絞り込みます。 空の関数リストを指定すると、すべての関数を選択したことになります。

  • F - デバッガからの出力の各行に、その出力の元となったマクロが含まれるソースファイル名を付加します。

  • i - デバッガからの出力の各行に、現在のプロセスの PID を付加します。

  • L - デバッガからの出力の各行に、その出力の元となったマクロが含まれるソースファイル内の行番号を付加します。

  • n - デバッガからの出力の各行に、現在の関数のネストレベルを付加します。

  • o[,file] - a[,file] と似ていますが、既存のファイルに追記するのではなく既存のファイルを上書きします。

  • O[,file] - A[,file] と似ていますが、既存のファイルに追記するのではなく既存のファイルを上書きします。

  • t[,N] - 関数の制御フローのトレースを有効にします。最大のネストレベルを N で指定します。 N のデフォルトは 200 です。

  • x - このオプションはプロファイリングを有効にします。

  • m - 呼び出しに関連する、メモリの確保と解放をトレースします。

利用例は、このようになります。

d:t:x:O,/tmp/mysqlnd.trace

注意:

この機能は、デバッグビルド版の PHP でしか使えません。 Microsoft Windows で使う場合は、Microsoft Visual C バージョン 9 以降でデバッグビルドした PHP を使わなければなりません。

mysqlnd.log_mask integer

どのクエリをログに記録するかを定義します。デフォルトは 0 で、これはクエリをログに記録しません。 値は静数値で定義します。PHP の定数はありません。 たとえば 48 (16 + 32) を設定すると、インデックスの選択が悪かったり (SERVER_QUERY_NO_GOOD_INDEX_USED = 16) まったくインデックスを使っていなかったり (SERVER_QUERY_NO_INDEX_USED = 32) といった理由で遅くなっているクエリをログに記録します。 2043 (1 + 2 + 8 + ... + 1024) を指定すると、あらゆる型の遅いクエリを記録します。

使える型は、次のとおりです。 SERVER_STATUS_IN_TRANS=1, SERVER_STATUS_AUTOCOMMIT=2, SERVER_MORE_RESULTS_EXISTS=8, SERVER_QUERY_NO_GOOD_INDEX_USED=16, SERVER_QUERY_NO_INDEX_USED=32, SERVER_STATUS_CURSOR_EXISTS=64, SERVER_STATUS_LAST_ROW_SENT=128, SERVER_STATUS_DB_DROPPED=256, SERVER_STATUS_NO_BACKSLASH_ESCAPES=512, SERVER_QUERY_WAS_SLOW=1024

mysqlnd.mempool_default_size integer

mysqlnd メモリプールのデフォルトサイズ。これは結果セットが使います。

mysqlnd.net_read_timeout integer

mysqlnd は、MySQL Client Library すなわち libmysqlclient とは異なるネットワーク API を使います。 mysqlnd は PHP ストリームを使いますが、 libmysqlclient は自前のラッパーを用意して操作レベルでのネットワークコールをしています。 PHP のデフォルト設定では、ストリームの読み込みタイムアウトは 60 秒です。これは php.inidefault_socket_timeout で設定します。 タイムアウト値を設定しなければ、すべてのストリームに対してデフォルト値が適用されます。 mysqlnd は何も値を設定しないので、長いクエリを実行して default_socket_timeout 秒が経過すると、接続を切断して "2006 - MySQL Server has gone away" というエラーが発生します。 MySQL Client Library のデフォルトのタイムアウトは 365 * 24 * 3600 秒 (1 年) で、TCP/IP のタイムアウトなどのその他のタイムアウトが発生するのを待ちます。 mysqlnd も同様に、非常に長いタイムアウトを使うことができます。この値は、 php.ini の新しい項目 mysqlnd.net_read_timeout で設定します。 mysqlnd.net_read_timeout は、mysqlnd を使うすべての拡張モジュール (ext/mysqlext/mysqliPDO_MySQL) が利用します。 mysqlnd は、PHP ストリームに対して mysqlnd.net_read_timeout を使うよう指示します。 MySQL Client Library および PHP ストリームの MYSQL_OPT_READ_TIMEOUT とは微妙に違いがあることに注意しましょう。 MYSQL_OPT_READ_TIMEOUT は TCP/IP 接続でしか動作しないとドキュメントに記載されており、 MySQL 5.1.2 より前のバージョンでは Windows でしか使えません。 PHP ストリームにはこの制限はありません。 信じられないならストリームのドキュメントを調べるとよいでしょう。

mysqlnd.net_cmd_buffer_size long

mysqlnd は、内部のコマンド/ネットワークバッファとして php.inimysqlnd.net_cmd_buffer_size で指定しただけのバイト数をすべての接続に対して確保します。 MySQL Client Server プロトコルのコマンド、たとえば COM_QUERY (通常のクエリ) がこのバッファに収まらない場合、mysqlnd はコマンドの送信に必要なだけバッファを拡張します。 ひとつの接続でバッファの拡張が発生するたびに command_buffer_too_small をひとつ加算します。

ほとんどすべての接続で mysqlndmysqlnd.net_cmd_buffer_size の初期値よりバッファを拡張せざるを得なくなったら、 デフォルトのサイズを大きくしてバッファの再割り当てを回避すべきでしょう。

バッファのデフォルトサイズは、PHP 5.3.0 では 2048 バイトです。 それより新しいバージョンでは、デフォルトが 4096 バイトになりました。 デフォルトを変更するには、php.inimysqlnd.net_cmd_buffer_size を設定するか、あるいは mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size) を使います。

バッファサイズを 4096 より小さくすることはおすすめしません。というのも、 mysqlnd が読み込む MySQL からの通信パケットの中には そのサイズに達するものもあるからです。 PHP 5.3.0 では、バッファのサイズを超えるパケットを MySQL が送ってきても mysqlnd はバッファを拡張しませんでした。 その結果、mysqlnd はパケットをデコードできずに クライアントアプリケーションがエラーを出すはめになっていました。 PHP 5.3.0 における mysqlnd.net_cmd_buffer_size のデフォルトである 2048 バイトを超えるパケットが送られくる可能性があるのは、次の二つの場合だけです。 ひとつは非常に巨大なエラーメッセージを送信してくる場合、 もうひとつは、パケットに COM_LIST_FIELD (mysql_list_fields()) からのメタデータが含まれており、 その中にデフォルト値が非常に長い (>1900 バイト) 文字列型のカラムのメタデータが含まれている場合です。

PHP 5.3.2 以降、mysqlnd では 4096 バイト未満のバッファを設定できなくなりました。

この値は mysqli_options(link, MYSQLI_OPT_NET_CMD_BUFFER_SIZE, size) でも変更できます。

mysqlnd.net_read_buffer_size long

MySQL コマンドパケットのボディを読み込むときの、読み込みチャンクの最大バイト数。 MySQL クライアントサーバープロトコルは、すべてのコマンドをパケット内にカプセル化します。 パケットは、小さなヘッダと実際の本体を含むボディで構成されています。 ボディのサイズはヘッダに書き込まれています。 mysqlnd はこのボディを、 MIN(header.size, mysqlnd.net_read_buffer_size) バイトごとに分割して読み込みます。パケットのボディが mysqlnd.net_read_buffer_size バイトより長い場合は、 mysqlndread() を複数回コールする必要があります。

この値は mysqli_options(link, MYSQLI_OPT_NET_READ_BUFFER_SIZE, size) でも設定できます。

mysqlnd.sha256_server_public_key string

SHA-256 認証プラグイン関連の設定。MySQL サーバーの RSA 公開鍵ファイル。

クライアントで RSA 公開鍵の設定をせずに済ませることができます。 そのためには、この設定項目で公開鍵を設定するか、実行時に mysqli_options() で鍵を指定します。 RSA 公開鍵をクライアントから渡さなかった場合は、 ここで指定した鍵を使って SHA-256 認証プラグインの認証手続きを進めます。

mysqlnd.fetch_data_copy long

デフォルトの参照とコピーオンライトのロジックを使わずに、 内部結果セットのバッファから PHP の変数に結果セットをコピーします。 詳細は メモリ管理の実装についての説明 を参照ください。

結果セットを PHP の変数から参照させるのではなくコピーすることで、 PHP の変数に割り当てたメモリを早めに解放できます。 ユーザー API のコードやクエリの内容、そして結果セットの大きさにも依存しますが、 これは mysqlnd のメモリ使用量の削減につながります。

PDO_MySQL を使う場合は設定しないでください。PDO_MySQL は、まだこの新しいフェッチモードに対応していません。


Mysqlnd
PHP Manual