herokuでPHPからMySQL(ClearDB)を使う

今日は、herokuでPHPからMySQLを使ってみたいと思います。

クレジットカード情報の登録

ClearDBを使用するには、無料プランでもクレジットカードの登録が必要になります。

herokuにログインし、「Manage Account」の「Billing」からクレジットカード情報を登録します。

Gitリポジトリの用意

まず、Gitリポジトリを作成します。

$ mkdir heroku-mysql
$ cd heroku-mysql/
$ touch composer.json
$ git init
$ git add -A
$ git commit -m "Initial commit"

herokuアプリの作成

herokuのアプリを作成します。

$ heroku create
https://damp-thicket-1597.herokuapp.com/ | https://git.heroku.com/damp-thicket-1597.git
Git remote heroku added

ClearDBアドオンをインストールします。igniteは無料プラン(データベースサイズ5MB)です。

$ heroku addons:add cleardb:ignite
Adding cleardb:ignite on damp-thicket-1597... done, v3 (free)
Use `heroku addons:docs cleardb` to view documentation.

composer.jsonを編集します。

composer.json

{
  "require": {
    "php": "~5.5.18"
  }
}

Procfileを作成します。

Procfile

web: vendor/bin/heroku-php-apache2 public

Apacheのドキュメントルートをpublicに変更しています。

ClearDBの設定

データベース接続情報を取得します。

$ heroku config
=== damp-thicket-1597 Config Vars
CLEARDB_DATABASE_URL: mysql://b3805c079c8eb9:40b9ad89@us-cdbr-iron-east-01.cleardb.net/heroku_c33169f285b123f?reconnect=true

上記の情報でmysqlコマンドを使いデータベースにアクセスします。なお、SSL設定をしていませんので通信は暗号化されていませんので注意してください。

$ mysql --host=us-cdbr-iron-east-01.cleardb.net --user=b3805c079c8eb9 --password=40b9ad89 heroku_c33169f285b123f

テスト用のテーブルを作成します。

mysql> CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(64),
    data_created DATETIME
);

データを挿入します。

mysql> INSERT INTO user VALUES (1, 'user1', NOW());
mysql> INSERT INTO user VALUES (2, 'user2', NOW());
mysql> INSERT INTO user VALUES (3, 'user3', NOW());

確認します。

mysql> SELECT * FROM user;
+----+-------+---------------------+
| id | name  | data_created        |
+----+-------+---------------------+
|  1 | user1 | 2014-12-11 10:48:16 |
|  2 | user2 | 2014-12-11 10:48:26 |
|  3 | user3 | 2014-12-11 10:48:31 |
+----+-------+---------------------+
3 rows in set (0.18 sec)

index.phpの作成

public/index.php

<?php

$db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
$db['dbname'] = ltrim($db['path'], '/');
$dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";

try {
    $db = new PDO($dsn, $db['user'], $db['pass']);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = 'SELECT * FROM user';
    $prepare = $db->prepare($sql);
    $prepare->execute();

    echo '<pre>';
    $prepare->execute();
    $result = $prepare->fetchAll(PDO::FETCH_ASSOC);
    print_r(h($result));
    echo "\n";
    echo '</pre>';
} catch (PDOException $e) {
    echo 'Error: ' . h($e->getMessage());
}

function h($var)
{
    if (is_array($var)) {
        return array_map('h', $var);
    } else {
        return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
    }
}

herokuへのデプロイ

herokuにデプロイします。

$ git add -A
$ git commit -m "Initial commit"
$ git push heroku master
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (9/9), 1.09 KiB | 0 bytes/s, done.
Total 9 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> Resolved composer.json requirement for PHP ~5.5.18 to version 5.5.19.
remote: -----> Installing system packages...
remote:        - PHP 5.5.19
remote:        - Apache 2.4.10
remote:        - Nginx 1.6.0
remote: -----> Installing PHP extensions...
remote:        - zend-opcache (automatic; bundled, using 'ext-zend-opcache.ini')
remote: -----> Installing dependencies...
remote:        Composer version 1.0-dev (4a3bc58adfd501fa6e82c82fdd9e8d4036898fa1) 2014-12-10 15:36:16
remote:        Loading composer repositories with package information
remote:        Installing dependencies
remote:        Nothing to install or update
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing... done, 70.8MB
remote: -----> Launching... done, v4
remote:        https://damp-thicket-1597.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/damp-thicket-1597.git
 * [new branch]      master -> master

確認

完了したら、ブラウザからアクセスしてみましょう。

$ heroku open

以下のように表示されればOKです。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => user1
            [data_created] => 2014-12-11 10:48:16
        )

    [1] => Array
        (
            [id] => 2
            [name] => user2
            [data_created] => 2014-12-11 10:48:26
        )

    [2] => Array
        (
            [id] => 3
            [name] => user3
            [data_created] => 2014-12-11 10:48:31
        )

)

参考

関連

Date: 2014/12/11

Tags: heroku, mysql, php, database