# 実行時設定

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

MySQL Native Driver 設定オプション
名前 | デフォルト | 変更可能 | 変更履歴
--- | --- | --- | ---
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 で削除されました。

INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。

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

`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 で削除されました。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open