解决一些在 Heroku 上使用 PostgreSQL 的疑惑
别跳过这一节,通过这一节,可以学习到一些数据库的配置的知识.
常规操作
通常我们在连接数据库的时候,会在 config/database.php
中使用 env()
函数来获取 .env
文件中的数据库配置信息,下面我把 config/database.php
拿出来并省略一些无关代码,然后写上一些注释,以供参考
<?php
return [
/*下面这一行代码说明你要连接什么数据库,默认是mysql,我们本地环境中的也是mysql,所以这里最终就是mysql.如果
你在heroku上使用,这里就需要改成pgsql,怎么改,教程里也写了,但是有些小伙伴有点懵,我稍后讲解怎么来更简单的操
作,当然简单操作的代价就是牺牲灵活性.*/
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
//mysql不需要修改
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
//下面的连接信息需要修改,我已经改掉了,怎么改,后面说
'pgsql' => [
'driver' => 'pgsql',
'host' => 'ec2-54-243-46-32.compute-1.amazonaws.com',
'port' => '5432',
'database' => 'db5pg2ugul7b02',
'username' => 'zifcipmvodyqle',
'password' => '8129f821b4729d9b89c4c0b9ca530652b3d768e881c8df6d23cad66b1e464437',
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
],
.
.
.
如何获取heroku上的数据库连接信息
方式一
方式一就是教程里写的方式,通过 $url = parse_url(getenv("DATABASE_URL"))
这一行代码来获取,这里的几个返回值我说明一下:
DATABASE_URL
这是在你heroku上创建了Postgres
数据库之后 heroku给你提供的一个URL,里面包含了数据库的连接信息,如何查看这个URL呢?使用heroku config
这个命令,看图它给我们显示了包括第2.4节设置的
APP_KEY
变量在内的环境变量.所以我们可以在项目中使用getenv("DATABASE_URL")
来获取,获取到之后,接下来需要解析这一段URL .parse_url(getenv("DATABASE_URL"))
这里的parse_url()
函数将该URL解析出来,并返回一个数组,数组内容如下进一步说就是我们得到了一个关于
Postgres
数据库的连接信息,接下来我用Navicat,填入相关信息,连接一下(没啥用,就是进去看看)
会看到属于我们的数据库已经创建成功了,这里面有很多别人的数据库,我们没权限访问.
既然得到了数据库信息,就可以像教程里一样来操作了.下面我写写我的方式,比较 简单暴力
方式二
使用heroku提供的命令 heroku pg:credentials:url DATABASE
来获取,看图显示出了数据库信息,既然我们得到了数据库连接信息,就可以自行更改
config/database.php
文件了(真实项目不推荐这样做),下面我把更改后的文件去掉无关内容,贴出来,写一些注释
<?php
return [
/*下面这一行代码,我判断 IS_IN_HEROKU 为真,就设置pgsql,不然就获取 `.env` 文件中的,在heroku
中,IS_IN_HEROKU=true(上文图中有显示),所以在heroku中,这里变成了pgsql,然后就会读取pgsql的配置,往下看*/
'default' => getenv('IS_IN_HEROKU') ? 'pgsql' : env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
//下面我直接把数据库信息写死在这里,但是失去了灵活性
'pgsql' => [
'driver' => 'pgsql',
'host' => 'ec2-54-243-46-32.compute-1.amazonaws.com', // <---这里
'port' => '5432', // <---这里
'database' => 'db5pg2ugul7b02', // <---这里
'username' => 'zifcipmvodyqle', // <---这里
'password' => '8129f821b4729d9b89c4c0b9ca530652b3d768e881c8df6d23cad66b1e464437', // <---这里
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
],
然后推送并执行迁移
$ git push heroku master
$ heroku run php artisan migrate
注册一个用户,正常
本帖已被设为精华帖!
本帖由系统于 5年前 自动加精
请问 ping 加上Heroku给出的Host显示请求超时怎么办
@StuChoChik 应该是被墙了,试试开 VPN
@青风百里 用了也还是不可以,确认邮件收不到。
我做到这里时会报这个问题,更改了database.php中Mysql的编码为utf8之后解决