我需要一个老版本的Laravel应用程序工作。 它使用的是Laravel版本4.2.2。
我有一个docker设置:
version: '3.5'
services:
laravel:
depends_on:
- database
...
database:
image: mysql:5
hostname: database
environment:
MYSQL_ROOT_PASSWORD: mypass
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypass
我将数据库数据添加到config(Laravel 4.2)
'connections' => array (
'mysql' => array (
'driver' => 'mysql',
'host' => 'database', // as name of db container
'database' => 'mydb', // this database exists, I can see in PhpMyAdmin
'port' => '3306',
'username' => 'root', // I can login with these credentials in PhpMyAdmin and CLI
'password' => 'mypass',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
...
我可以使用这些凭据登录到phpmyadmin容器,也可以使用mysql-h database-u root-p
从laravel容器的CLI登录。
如果我在LaravelIlluminate/database/connectors/connector.php
类中转储连接,我会看到正在使用正确的配置。
public function createConnection($dsn, array $config, array $options)
{
$username = array_get($config, 'username');
$password = array_get($config, 'password');
// dd($dsn);
// dd($config);
// dd($username); dd($password);
return new PDO($dsn, $username, $password, $options);
}
给予:
>
string(59)“mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=mydb”
数组(11){[“driver”]=>string(5)“mysql”[“host”]=>string(8)“database”[“port”]=>string(4)“3306”[“database”]=>string(4)“root”[“password”]=>string(21)“mypass”[“charset”]=>string(4)“utf8”[“collation”]=>string(15)“utf8_unicode_ci”[“prefix”]=>string(0)“[”unix_socket“]=>string(27)”
超级用户`(用户名)
mypass
(密码)
为什么我仍然得到错误?
我发现问题了。 如果查看Illuminate/database/connectors/connector.php
CreateConnection
中的$dsn
-值:
string(59) "mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=mydb"
您可以看到host=database
根本没有,尽管我在laravel配置中添加了它。
手动添加它解决了这个问题:
$dsn= "mysql:unix_socket=/var/run/mysqld/mysqld.sock;host=database;dbname=mydb";
尽管我在配置中添加了主机,但我发现在另一个数据库
-config中,有一个unix_socket
-value添加到mysql
配置中。 Laravel获取套接字或主机信息。 我的host
-value尚未被覆盖,但其他配置中的unix_socket
-value阻止了通过host
的连接。
所以我只是删除了另一个配置中的unix_socket
。
SQLSTATE[HY000][2002]
的可能原因如下
>
MySQL未运行
数据库设置不正确
服务器资源不足
根据对方案的分析,可能的原因是数据库设置不正确
我这边可能的建议是在Laravel中找到正确的数据库设置。
在大多数情况下,问题在于docker中的主机解析,因此我建议您找到正确的主机名和端口,以便laravel容器能够与mysql容器连接
按照本教程中描述的步骤进行操作,或者用您现有的系统验证步骤,可能会解决您的问题。