Cent os Apache + php + PHPからのMySQLアドレス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
また、すべてが機能します。何が問題なのか?
ソフトウェアバージョン
最後に、
$ 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
StackOverflowでのこの(受け入れられない)回答 によると、理由はMySQLがlocalhost
を127.0.0.1
とは異なる方法で解釈するためです。これは ドキュメントで確認済み で始まります。「Unixでは、MySQLプログラムはホスト名localhost
を特別に扱います "。
127.0.0.1
は明示的なIPv4アドレスであるため、クライアントはTCP/IP経由で接続を試みますlocalhost
は、ローカルホストを使用するための暗黙のヒントです。MySQLは、可能であれば、TCP/IPではなくローカルソケットを介して実装します。localhost
接続は機能しますが、127.0.0.1
接続は機能しないため、次の問題の1つが原因である可能性があります。
127.0.0.1
からの接続を拒否しますbind
構成エントリを変更して、ループバックアドレスにバインドしないようにしましたエラーコード13(permission denied)が与えられた場合、他の2つの前に最初の1つを調査します。