php.ini の設定により動作が変化します。
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
mysqlnd.collect_statistics | "1" | INI_SYSTEM |
|
mysqlnd.collect_memory_statistics | "0" | INI_SYSTEM |
|
mysqlnd.debug | "" | INI_SYSTEM |
|
mysqlnd.log_mask | 0 | INI_ALL |
|
mysqlnd.mempool_default_size | 16000 | INI_ALL |
|
mysqlnd.net_read_timeout | "86400" | INI_ALL |
PHP 7.2.0 より前のバージョンでは、
デフォルト値は "31536000" で、変更可能な範囲が INI_SYSTEM でした。
|
mysqlnd.net_cmd_buffer_size | "4096" | INI_SYSTEM |
|
mysqlnd.net_read_buffer_size | "32768" | INI_SYSTEM |
|
mysqlnd.sha256_server_public_key | "" | INI_PERDIR |
|
mysqlnd.trace_alloc | "" | INI_SYSTEM |
|
mysqlnd.fetch_data_copy | 0 | INI_ALL |
PHP 8.1.0 で削除されました。 |
以下に設定ディレクティブに関する 簡単な説明を示します。
mysqlnd.collect_statistics
bool
さまざまなクライアント統計情報の収集を有効にします。収集した情報には
mysqli_get_client_stats() や
mysqli_get_connection_stats() でアクセスでき、
phpinfo() 関数の出力の
mysqlnd
セクションにも表示されます。
この設定項目は、メモリ管理に関するもの以外のすべての MySQL Native Driver 統計情報 を有効にします。
mysqlnd.collect_memory_statistics
bool
さまざまなメモリ統計情報の収集を有効にします。収集した情報には
mysqli_get_client_stats() や
mysqli_get_connection_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 でしか使えません。
mysqlnd.log_mask
int
どのクエリをログに記録するかを定義します。デフォルトは 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
int
mysqlnd メモリプールのデフォルトサイズ。これは結果セットが使います。
mysqlnd.net_read_timeout
int
mysqlnd
は、MySQL Client Library すなわち
libmysqlclient
とは異なるネットワーク API を使います。
mysqlnd
は PHP ストリームを使いますが、
libmysqlclient
は自前のラッパーを用意して操作レベルでのネットワークコールをしています。
PHP のデフォルト設定では、ストリームの読み込みタイムアウトは 60 秒です。これは
php.ini の
default_socket_timeout
で設定します。
タイムアウト値を設定しなければ、すべてのストリームに対してデフォルト値が適用されます。
mysqlnd
は何も値を設定しないので、長いクエリを実行して
default_socket_timeout
秒が経過すると、接続を切断して
2006 - MySQL Server has gone away
というエラーが発生します。
MySQL Client Library のデフォルトのタイムアウトは
24 * 3600 秒 (1 日) で、TCP/IP のタイムアウトなどのその他のタイムアウトが発生するのを待ちます。
mysqlnd
も同様に、非常に長いタイムアウトを使うことができます。この値は、
php.ini の新しい項目
mysqlnd.net_read_timeout
で設定します。
mysqlnd.net_read_timeout
は、mysqlnd
を使うすべての拡張モジュール (ext/mysql
や
ext/mysqli
、PDO_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
int
mysqlnd
は、内部のコマンド/ネットワークバッファとして
php.ini の mysqlnd.net_cmd_buffer_size
で指定しただけのバイト数をすべての接続に対して確保します。
MySQL Client Server プロトコルのコマンド、たとえば
COM_QUERY
(通常のクエリ)
がこのバッファに収まらない場合、mysqlnd
はコマンドの送信に必要なだけバッファを拡張します。
ひとつの接続でバッファの拡張が発生するたびに
command_buffer_too_small
をひとつ加算します。
ほとんどすべての接続で mysqlnd
が
mysqlnd.net_cmd_buffer_size
の初期値よりバッファを拡張せざるを得なくなったら、
デフォルトのサイズを大きくしてバッファの再割り当てを回避すべきでしょう。
デフォルトのバッファサイズは 4096 バイトです。これは、設定可能な最小値です。
この値は mysqli_options(link,
MYSQLI_OPT_NET_CMD_BUFFER_SIZE, size)
でも変更できます。
mysqlnd.net_read_buffer_size
int
MySQL コマンドパケットのボディを読み込むときの、読み込みチャンクの最大バイト数。
MySQL クライアントサーバープロトコルは、すべてのコマンドをパケット内にカプセル化します。
パケットは、小さなヘッダと実際の本体を含むボディで構成されています。
ボディのサイズはヘッダに書き込まれています。
mysqlnd
はこのボディを、
MIN(header.size, mysqlnd.net_read_buffer_size)
バイトごとに分割して読み込みます。パケットのボディが
mysqlnd.net_read_buffer_size
バイトより長い場合は、
mysqlnd
は read()
を複数回コールする必要があります。
この値は 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.trace_alloc
string
mysqlnd.fetch_data_copy
int
デフォルトの参照とコピーオンライトのロジックを使わずに、 内部結果セットのバッファから PHP の変数に結果セットをコピーします。 詳細は メモリ管理の実装についての説明 を参照ください。
結果セットを PHP の変数から参照させるのではなくコピーすることで、 PHP の変数に割り当てたメモリを早めに解放できます。 ユーザー API のコードやクエリの内容、そして結果セットの大きさにも依存しますが、 これは mysqlnd のメモリ使用量の削減につながります。
PDO_MySQL を使う場合は設定しないでください。PDO_MySQL は、まだこの新しいフェッチモードに対応していません。
注意: この設定は、PHP 8.1.0 で削除されました。