Heroku 環境で、PHP から、Heroku Postgres(PostgreSQL)に接続します。
Heroku Postgres アドオンを追加
Heroku Postgres アドオンを利用します。(無料プラン(Hobby Dev)あり: 接続数上限=20 / レコード数上限=10,000 / メモリキャッシュなし)
https://addons.heroku.com/heroku-postgresql
https://devcenter.heroku.com/articles/heroku-postgres-plans
$ heroku addons:create heroku-postgresql
(heroku addons:add は deprecated になった(コメント参照)ので、addons:create に変更)
環境変数から接続情報を取得
Heroku Postgres アドオンを追加すると、PostgreSQL への接続情報が環境変数DATABASE_URL
にセットされます。
DATABASE_URL
の内容は下記のような URL の形式になっています。
DATABASE_URL=postgres://xxxxx:yyyyyy@ec2-nnn-nnn-nnn-nnn.compute-1.amazonaws.com:5432/XXXXXXX
これを PHP のparse_url()
でパースします。
<?php
$url = parse_url(getenv('DATABASE_URL'));
スクリプトを実行すると、$url
の各要素には下記のようになります。
- $url['host'] = 接続ホスト名
- substr($url['path'], 1) = 接続データベース名
- $url['user'] = 接続ユーザ名
- $url['pass'] = 接続パスワード
この内容を接続情報として利用します。
PDO で接続する
PDO で Heroku Postgres に接続して、サーババージョンを出力しています。
<?php
$url = parse_url(getenv('DATABASE_URL'));
$dsn = sprintf('pgsql:host=%s;dbname=%s', $url['host'], substr($url['path'], 1));
$pdo = new PDO($dsn, $url['user'], $url['pass']);
var_dump($pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
実行結果
$ php pdo_with_heroku_postgres.php
string(5) "9.3.3"
Laravel で接続する
database.php
に接続情報をセットしています。
<?php
$url = parse_url(getenv('DATABASE_URL'));
return [
'default' => 'pgsql',
'connections' => [
'pgsql' => [
'driver' => 'pgsql',
'host' => $url['host'],
'database' => substr($url['path'], 1),
'username' => $url['user'],
'password' => $url['pass'],
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
],
],
];