LoginSignup
27
27

More than 5 years have passed since last update.

Heroku + PHP から Heroku Postgres に接続する

Last updated at Posted at 2014-06-07

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',
        ],
    ],
];
27
27
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
27