简体   繁体   English

建立与 CakePHP 数据库的连接时出错

[英]Error establishing connection to CakePHP database

I want to learn CakePHP and immidiatly get strange error =) Trying to create a model via the console我想学习 CakePHP 并立即得到奇怪的错误 =) 尝试通过控制台创建模型

bin/cake bake model Posts

And getting an error并得到一个错误

root@5b118a83e609:/var/www/public/cake# bin/cake bake model Posts
One moment while associations are detected.
Exception: Connection to Mysql could not be established: SQLSTATE[HY000] [2002] No such file or directory
In [/var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver.php, line 140]

2020-10-07 09:23:42 Error: [Cake\Database\Exception\MissingConnectionException] Connection to Mysql could not be established: SQLSTATE[HY000] [2002] No such file or directory in /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver.php on line 140
Exception Attributes: array (
  'driver' => 'Mysql',
  'reason' => 'SQLSTATE[HY000] [2002] No such file or directory',
)
Stack Trace:
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php:178
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Schema/SchemaDialect.php:47
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php:230
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:53
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Connection.php:399
- /var/www/public/cake/vendor/cakephp/bake/src/Utility/TableScanner.php:65
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:1060
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:191
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:122
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:98
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:81
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/BaseCommand.php:179
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/CommandRunner.php:336
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/CommandRunner.php:171
- /var/www/public/cake/bin/cake.php:12

Caused by: [PDOException] SQLSTATE[HY000] [2002] No such file or directory in /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver.php on line 132
Stack Trace:
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver.php:132
- /var/www/public/cake/vendor/cakephp/cakephp/src/Core/Retry/CommandRetry.php:70
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver.php:138
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php:178
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Schema/SchemaDialect.php:47
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php:230
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:53
- /var/www/public/cake/vendor/cakephp/cakephp/src/Database/Connection.php:399
- /var/www/public/cake/vendor/cakephp/bake/src/Utility/TableScanner.php:65
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:1060
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:191
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:122
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:98
- /var/www/public/cake/vendor/cakephp/bake/src/Command/ModelCommand.php:81
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/BaseCommand.php:179
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/CommandRunner.php:336
- /var/www/public/cake/vendor/cakephp/cakephp/src/Console/CommandRunner.php:171
- /var/www/public/cake/bin/cake.php:12

Setting are 100% correct: config/app.php设置 100% 正确: config/app.php

'host' =>  'mariadb',
'port' =>  3306,
'username' =>  'root',
'password' =>  'password',
'database' =>  'database',

I am using Docker.我正在使用 Docker。 Nearby is Yii2, Laravel, Symfony and WordPress.附近是 Yii2、Laravel、Symfony 和 WordPress。 All works fine and without any errors but CakePHP for some reason cannot connect to the database.一切正常,没有任何错误,但 CakePHP 由于某种原因无法连接到数据库。

How to fix it?如何解决?

PS: PS:

By the way, if I open a freshly installed framework in a browser, then there will also be an error in the "Database" block顺便说一句,如果我在浏览器中打开一个新安装的框架,那么“数据库”块中也会出现错误

CakePHP is NOT able to connect to the database.
Connection to Mysql could not be established: SQLSTATE[HY000] [2002] No such file or directory

At the same time, I tried to connect directly to the database through the native PHP functions mysql_connect - everything works!同时,我尝试通过原生 PHP 函数mysql_connect直接连接到数据库 - 一切正常! But CakePHP doesn't want to work.但是 CakePHP 不想工作。

I have already tried changing hosts from mariadb to Docker container's IP and it didn't help me.我已经尝试将主机从mariadb更改为 Docker 容器的IP ,但对我没有帮助。

'host' =>  '192.168.32.3',
'port' =>  3306,
'username' =>  'root',
'password' =>  'password',
'database' =>  'database',

Not working.不工作。

You're using mariadb as your host instead of the IP of the actual MySQL container.您使用mariadb作为主机而不是实际 MySQL 容器的 IP。 Normally you can use localhost but since you're using Docker this is not possible.通常您可以使用localhost但由于您使用的是 Docker,这是不可能的。 Make sure you use the IP of the MySQL/MariaDB container.确保使用 MySQL/MariaDB 容器的 IP。

In case you don't know how, use docker ps and it will show you all your containerID's.如果您不知道如何操作,请使用docker ps ,它会显示您所有的 containerID。 Then look up the IP in the right container (with the containerID) docker inspect CONTAINERIDGOESHERE | grep "IPAddress"然后在正确的容器中查找 IP(使用 containerID) docker inspect CONTAINERIDGOESHERE | grep "IPAddress" docker inspect CONTAINERIDGOESHERE | grep "IPAddress" . docker inspect CONTAINERIDGOESHERE | grep "IPAddress"

Use this IP in your DB connection instead of localhost and you're set.在你的数据库连接中使用这个 IP 而不是 localhost 并且你已经设置好了。

So you're config looks like this:所以你的配置是这样的:

'host' =>  '172.19.0.2', // This is example IP, replace it with your found IP
'port' =>  3306,
'username' =>  'root',
'password' =>  'password',
'database' =>  'database',

Updated Answer: Please don't use IP's to connect to containers.更新的答案:请不要使用 IP 连接到容器。 IP's can change on container recreation and is therefor a bad practice. IP 可以在容器娱乐中改变,因此是一种不好的做法。 Use the container name instead.请改用容器名称。 Just make sure you add the networks line to your container and global.只需确保将网络行添加到容器和全局。 Would look something like this:看起来像这样:

version: "3.1"
services:

  mariadb:
    image: mariadb:10.6
    container_name: mariadb
    working_dir: /application
    volumes:
      - .:/application
    ports:
      - "1027:3306"
    networks:
      - application

  webserver:
    container_name: webserver
    image: nginx:alpine
    working_dir: /application
    volumes:
      - .:/application
    ports:
      - "1025:80"
    networks:
      - application
networks:
  application:

Your DB connection string would look something like this: root:root@containerNameb/dbName您的数据库连接字符串看起来像这样:root:root@containerNameb/dbName

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM