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