![SQLSTATE[HY000] [2003] '127.0.0.1' (13) の MySQL サーバーに接続できませんが、'localhost' は動作します](https://rvso.com/image/97160/SQLSTATE%5BHY000%5D%20%5B2003%5D%20'127.0.0.1'%20(13)%20%E3%81%AE%20MySQL%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8C%E3%80%81'localhost'%20%E3%81%AF%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99.png)
Cent OS Apache + php + MySQLからphpアドレス127.0.0.1のMySQLに接続しようとすると、エラーが発生します。行を置き換えると127.0.0.1
、localhost
すべて問題なく動作します。ブラウザのphpの唯一の問題。コンソールを実行すると
php -r "var_dump (mysqli_connect ( '127.0.0.1', 'user', 'pass', 'db_name'))"
エラーはありません。また、コンソールに入力する場合
mysql -u user -h 127.0.0.1 -p db_name
または
mysql -u user -h localhost -p db_name
すべて正常に動作します。何が問題なのでしょうか?
ソフトウェアバージョン
- PHP-5.6.26
- MySQL-5.5.53
- アパッチ2.2.15
ついに、
$ host localhost
localhost has address 127.0.0.1
PHPコードの動作:
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
PHP コードが機能しない:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
SQLSTATE[HY000] [2003] '127.0.0.1' の MySQL サーバーに接続できません (13)
PHPコードの動作:
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");
PHP コードが機能しない:
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
解決:
setsebool httpd_can_network_connect_db on
答え1
によるとStackOverflow 上のこの(未承認の)回答理由はMySQLがlocalhost
を異なる方法で解釈するためです127.0.0.1
。これは文書で確認、次の段落を参照してください。Unixでは、MySQLプログラムはホスト名をlocalhost
特別に扱います「」。
- 明示的なIPv4アドレスなので
127.0.0.1
、クライアントはTCP/IP経由で接続を試みます。 - これは
localhost
、ローカルホストを使用するための暗黙のヒントであり、MySQLは、可能な場合はTCP/IPではなくローカルソケット経由で実装します。
localhost
接続は機能しているのに、もう 1 つの接続が機能していない場合は127.0.0.1
、次のいずれかの問題が原因である可能性があります。
- データベースの権限により接続が拒否されました
127.0.0.1
- TCP/IP経由のすべての受信データベース接続試行をブロックするファイアウォールルールがある
- MySQLの設定エントリを変更して
bind
、ループバックアドレスにバインドしないようにしました
エラーコード13(許可が拒否されました)、私は他の 2 つよりもまず最初のものを調べます。