数据库连接

1.启用PHP数据库插件

在php安装目录下的php.ini文件中启用数据库插件:

1
2
3
4
5
// postgres数据库
extension=pdo_pgsql
extension=pgsql
// mysql数据库
extension=pdo_mysql

2.编辑数据库连接配置

1.通过app.php配置

打开项目下config/app.php文件编辑【Datasources】,修改默认数据库连接配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    'Datasources' => [
        'default' => [
            // 表示与数据库服务器的连接的类的完全命名空间的类名。 该类负责加载数据库驱动程序,提供SQL事务机制以及准备SQL语句等。  
            'className' => Connection::class,
            // 用于实现数据库引擎所有特性的驱动程序的类名。 这可以是使用插件语法的短类名,完全命名空间的名称或构造的驱动程序实例。 
            // 短类名的示例是Mysql,Sqlite,Postgres和Sqlserver。连接不同数据库,将短类名替换即可。
            'driver' => Postgres::class,
            // 是否使用与数据库的持久连接。在使用表锁及事务的情况下,不要开始持久化连接,在脚本无法释放表锁或者脚本在事务阻塞前结束,会导致其随后使用相同连接的脚本将会被持久的阻塞,需要重启数据服务器才能解决
            'persistent' => false,
            // 数据库服务器的主机名(或IP地址)
            'host' => 'host',
            'port' => 'port',
            // 数据库用户名
            'username' => 'username',
            // 数据库密码
            'password' => 'password',
            // 数据库名称
            'database' => 'db_name',
            // 未设置值,默认为UTF-8。MariaDB 和 MySQL 可设置utf8mb4。
            // 'encoding' => 'utf8mb4',
            // 服务器时区
            'timezone' => 'UTC',
            // 不建议禁用元数据缓存,可能导致性能非常差。
            'cacheMetadata' => true,
            // 查询日志记录
            'log' => false,
            // 如果在表或列名称中使用保留字或特殊字符,则设置为true,否则不要启用, 它会降低性能。
            'quoteIdentifiers' => false,
            // 连接创建时,需要执行的sql列表
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
        ],
    ],

2.通过.env环境变量配置

打开config/bootstrap.php文件,将下面代码解除注释

1
2
3
4
5
6
7
   if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
       $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
       $dotenv->parse()
           ->putenv()
           ->toEnv()
           ->toServer();
   }
打开config/.env 文件(若没有此文件,新建名称为 .env 的文件),添加代码:
1
2
3
4
5
// Postgres 数据库
export DATABASE_URL="Postgres://username:password@host:port/db_name?encoding=utf8&timezone=UTC&cacheMetadata=true&quoteIdentifiers=false&persistent=false"

// Mysql 数据库
export DATABASE_URL="Mysql://username:password@host:port/db_name?encoding=utf8mb4&timezone=UTC&cacheMetadata=true&quoteIdentifiers=false&persistent=false"

打开项目下config/app.php文件编辑【Datasources】,新增名称为【environment】的数据库连接配置

1
2
3
4
5
    'Datasources' => [
        'environment' => [
            'url' => env('DATABASE_URL'),
        ],
    ],

3.测试

在src/Controller下新建ConnectionController.php,写入代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
namespace App\Controller;

use Cake\Datasource\ConnectionManager;
use Cake\Database\Exception\MissingConnectionException;

class ConnectionController extends AppController
{
    // 初始化controller
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }

    /**
     * 测试数据库连接
     */
    public function testConnection()
    {
        // 关闭返回view
        $this->autoRender = false;
        try {
            $connection = ConnectionManager::get('default');
            $connected = $connection->connect();
            if ($connected) {
                echo "数据库已连接";
            }
        } catch (MissingConnectionException $e) {
            echo "数据库连接异常";
            return;
        }
    }
}

在config/routes.php中添加路由配置:

1
2
3
4
5
6
7
8
         $routes->resources('Connection', [
              'map' => [
                  'testConnection' => [
                      'action' => 'testConnection',
                      'method' => 'GET'
                  ]
              ]
          ]);

使用postman访问http://localhost:8765/connection/test_connection 查看

php main page