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を見て、効果を確かめます。
関連記事: