PHPのお勉強!

PHP TOP

実行時設定

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.inidefault_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/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 int

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

ほとんどすべての接続で mysqlndmysqlnd.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 バイトより長い場合は、 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.trace_alloc string

mysqlnd.fetch_data_copy int

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

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