2026年9月25日

2026年9月25日

WordPressとMySQLの接続数・タイムアウト設定|接続プールの無いPHPでの考え方

「データベースの接続プール」と「接続のタイムアウト」は、Java などのアプリケーションサーバーではアプリ側で設定するのが一般的です。しかし WordPress(PHP)には、アプリ側で接続を使い回す仕組みが標準ではありません。この記事では、WordPress がデータベースへどう接続しているかを確認したうえで、MySQL 側で調整できる接続数とタイムアウトの設定を説明します。

既定値などは、2026年10月時点の MySQL 8.4 と MariaDB 11.8(どちらも Docker の公式イメージ)と、WordPress 6.9 のソースコードで確認しています。

WordPressはリクエストごとに接続する

WordPress のデータベース接続は wpdb クラス(wp-includes/class-wpdb.php)が受け持ちます。

  • ページを1回表示するたびに、PHP の mysqli_real_connect() で MySQL に接続し、リクエストが終われば接続も閉じます。次のリクエストへ接続を持ち越すことはありません。
  • PHP-FPM の子プロセス1つは同時に1つのリクエストしか処理しないので、WordPress からの同時接続数は、おおむね「処理中の PHP の子プロセス数」になります。これに WP-CLI、サーバーの cron、バックアップの接続が加わります。
  • 接続が途中で切れて MySQL server has gone away(エラー番号 2006)になったときは、wpdb が自動で再接続を試み(既定で最大5回、1秒間隔)、成功すればクエリをやり直します。

存在しない設定に注意

インターネット上には、次のような存在しない設定を紹介している情報があります。設定しても何も起きません。

書かれていることがある設定 実際
wp-config.php の DB_CONNECTION_TIMEOUT WordPress のコアに無い定数。wpdb は接続のタイムアウトを指定していない
W3TC_DB_POOL などプラグインの「接続プール」定数 WP Super Cache・W3 Total Cache はキャッシュのプラグインで、接続プールの機能は無い
SHOW POOL STATUS; MySQL に無い SQL
innodb_buffer_pool_size で接続プールを設定 データとインデックスをメモリに置くキャッシュの大きさで、接続とは関係ない

アプリの外で接続を使い回したい場合は、PHP の永続接続や ProxySQL のような接続を中継するソフトを使う方法があります。これらは注意点が多いので、MySQLのコネクションプールをPHP・WordPressで実現する方法で別に説明しています。

MySQL側の接続とタイムアウトの設定

変数 既定値(MySQL 8.4 / MariaDB 11.8) 意味
max_connections 151 同時に接続できる数の上限。超えると Too many connections
wait_timeout 28800 秒(8時間) 何もしていない接続を、サーバーが切るまでの秒数(通常の接続)
interactive_timeout 28800 秒 同上。mysql コマンドのような対話型のクライアントの場合
connect_timeout 10 秒 接続の手続き(認証など)が終わるまで、サーバーが待つ秒数

現在の値は次の SQL で確認できます。

SELECT @@max_connections, @@wait_timeout, @@interactive_timeout, @@connect_timeout;

wait_timeout は、接続した時点のグローバル値がその接続に引き継がれます。SET GLOBAL wait_timeout = ... を実行しても、すでにある接続の値は変わりません。

今の接続の状態を確かめる

設定を変える前に、実際に何本の接続が使われているかを確認します。

SHOW GLOBAL STATUS WHERE Variable_name IN (
  'Threads_connected',                 -- 今つながっている数
  'Max_used_connections',              -- 起動してからの最大同時接続数
  'Max_used_connections_time',         -- その最大を記録した日時(MySQL)
  'Connection_errors_max_connections', -- 上限に達して断った回数
  'Aborted_clients',                   -- 正しく閉じられずに切れた接続の数
  'Aborted_connects'                   -- 接続に失敗した回数
);
  • Max_used_connections が max_connections に近い、または Connection_errors_max_connections が増えているなら、上限に達しています。
  • 接続ごとの状態は SHOW PROCESSLIST; で見られます。Command が Sleep で Time が大きい接続が多数あるなら、使い終わった接続が閉じられずに残っています。
# サーバーのシェルから見る場合
mysqladmin -u root -p processlist
mysqladmin -u root -p extended-status | grep -E "Threads_connected|Max_used_connections"

max_connectionsの決め方

WordPress だけが使うデータベースなら、次の合計に余裕を足した値が目安です。

  • そのデータベースを使うすべての PHP-FPM プールの pm.max_children の合計
  • WP-CLI、cron、バックアップ、監視などが同時に使う接続
  • 管理者が調査のために接続する分

たとえば pm.max_children = 40 のプールが2つあるサーバーなら、PHP からだけで最大80本になります。

上限を大きくするほど、同時に動くスレッドとメモリが増えます。上限に達する原因が「遅いクエリで接続が長く埋まっている」ことなら、上限を上げても待ちが増えるだけなので、先に遅いクエリを減らしてください。

上限に達すると、新しい接続は ERROR 1040 (08004): Too many connections で断られ、WordPress は「データベース接続確立エラー」を表示します。なお MySQL は、CONNECTION_ADMIN(または SUPER)権限を持つユーザーのために、上限とは別に1本だけ接続を空けておくので、管理者は調査のために接続できます。

wait_timeoutの決め方

WordPress のページ表示は数秒で終わり、接続もそのたびに閉じられるので、wait_timeout の長さはふだんの表示には影響しません。影響するのは次のような場面です。

  • 値が長すぎる場合: 異常終了したプログラムや、永続接続が残した使われない接続が、長い時間 Sleep のまま max_connections の枠を占めます。
  • 値が短すぎる場合: WP-CLI での大量インポートや、外部 API を待つ処理のように、データベースを使わない時間が長いバッチ処理で接続が切られます。WordPress のクエリは wpdb が再接続しますが、独自に PDO や mysqli で接続しているスクリプトは MySQL server has gone away で失敗します。

Sleep の接続が多くて困っている場合は、数百秒程度から試し、バッチ処理が失敗しないかを確認しながら決めます。バッチ処理の側で、その接続だけ SET SESSION wait_timeout = 3600; のように延ばすこともできます。

設定の変え方

再起動せずに変える

SET GLOBAL max_connections = 200;
SET GLOBAL wait_timeout = 600;

すぐに反映されますが(wait_timeout は新しい接続から)、MySQL を再起動すると元に戻ります。MySQL 8.0 以降は SET PERSIST にすると、再起動後も残ります。

設定ファイルで変える

[mysqld]
max_connections = 200
wait_timeout = 600
環境 設定ファイルの例 再起動
Ubuntu / Debian の MySQL /etc/mysql/mysql.conf.d/mysqld.cnf sudo systemctl restart mysql
RHEL 系の MySQL(公式リポジトリ) /etc/my.cnf sudo systemctl restart mysqld
Debian / Ubuntu の MariaDB /etc/mysql/mariadb.conf.d/50-server.cnf sudo systemctl restart mariadb

レンタルサーバーやマネージドデータベースでは、これらの変数を利用者が変えられないことが多いので、その場合はサービスの管理画面や仕様を確認してください。

スレッドプールについて

接続数が多いときに、接続ごとにスレッドを作る代わりに少数のスレッドで処理する「スレッドプール」という仕組みがあります。MariaDB には標準で入っており、thread_handling = pool-of-threads で有効になります(既定は接続ごとにスレッドを作る one-thread-per-connection)。MySQL では Enterprise Edition の機能で、Community Edition には含まれていません。スレッドプールは接続の数そのものを減らすものではないので、max_connections の見積もりは別に必要です。

まとめ

  • WordPress はリクエストごとに接続し、アプリ側の接続プールやタイムアウトの定数はありません。DB_CONNECTION_TIMEOUT や SHOW POOL STATUS は存在しません。
  • 同時接続数は PHP-FPM の子プロセス数でおおむね決まるので、max_connections は pm.max_children の合計に余裕を足して決めます。
  • wait_timeout は放置された接続を片付ける設定です。短くするときは、長いバッチ処理が切られないかを確認します。
  • 変更の前後に Threads_connected・Max_used_connections・Connection_errors_max_connections を見て、効果を確かめます。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲