"mysql.sock" を使った PHP/MySQL 接続の落とし穴:トラブルシューティングガイド
PHP/MySQL 接続エラー:mysql.sock 使用時の高負荷下での問題とその解決策
高負荷下で PHP から MySQL/MariaDB への接続が "mysql.sock" を使用して行われる場合、接続エラーが発生することがあります。この問題の原因と解決策について、以下の内容で解説します。
問題の症状
以下のエラーメッセージが表示されることがあります。
Warning: mysqli_connect(): (HY000/2002) Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
問題の原因
この問題には、主に以下の2つの原因が考えられます。
- ソケットファイルが存在しない、またはアクセス権限が不足している
- MySQL/MariaDB サーバーが起動していない
解決策
1 ソケットファイルの確認と設定
- ソケットファイルが存在するか確認します。
$ ls -l /tmp/mysql.sock
ファイルが存在しない場合は、MySQL/MariaDB サーバーのインストール時に作成されます。インストール方法を確認してください。
$ ls -l /tmp/mysql.sock | awk '{print $1}'
出力結果が "srwxrwxrwx" 以外の場合、以下のコマンドでアクセス権限を変更します。
$ sudo chmod 777 /tmp/mysql.sock
- PHP スクリプト内で使用されているソケットファイルパスを確認します。
$mysqli = new mysqli("localhost", "user", "password", "database", "/var/lib/mysql/mysql.sock");
デフォルトでは "/tmp/mysql.sock" が使用されますが、必要に応じて上記のようにパスを指定できます。
以下のコマンドで MySQL/MariaDB サーバーが起動しているか確認します。
$ ps aux | grep mysql
サーバーが起動していない場合は、以下のコマンドで起動します。
$ sudo service mysql start
/etc/mysql/my.cnf
などの設定ファイルで、ソケットファイルの場所や接続に関する設定を確認してください。
- PHP の設定を確認する
php.ini
などの設定ファイルで、MySQL/MariaDB への接続に関する設定を確認してください。
- ファイアウォールの設定を確認する
ファイアウォールが使用されている場合は、MySQL/MariaDB サーバーへの接続が許可されていることを確認してください。
注意事項
上記の情報は一般的な解決策として提供されています。問題解決のためには、個々の環境に合わせて原因を調査し、適切な対処を行う必要があります。
その他
免責事項
<?php
// データベース接続情報
$host = "localhost";
$user = "user";
$password = "password";
$database = "database";
$socket = "/tmp/mysql.sock";
// MySQL/MariaDB への接続
$mysqli = new mysqli($host, $user, $password, $database, $socket);
// 接続エラーチェック
if ($mysqli->connect_errno) {
echo "接続エラー: " . $mysqli->connect_error . "\n";
exit();
}
// クエリ実行
$query = "SELECT * FROM users";
$result = $mysqli->query($query);
// 結果処理
while ($row = $result->fetch_assoc()) {
echo $row["name"] . "\n";
}
// 接続切断
$mysqli->close();
?>
上記のコードはサンプルであり、実際の環境に合わせて変更する必要があります。
"mysql.sock" 以外の接続方法
TCP/IP 接続
$mysqli = new mysqli("localhost", "user", "password", "database", 3306);
Unix ドメインソケット (抽象ソケット)
$mysqli = new mysqli("localhost", "user", "password", "database", "/var/run/mysqld/mysqld.sock");
PDO 接続
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "password");
接続方法の選択
どの方法を選択するかは、以下の点を考慮する必要があります。
- 環境
- セキュリティ
- パフォーマンス
php mysql mariadb