はじめに
RedHat の PaaS である OpenShift Online を触ってみました。
OpenShift へのサインアップはだいぶ前にやっていたので、サインアップの方法やドメインの登録、公開鍵の登録、などの手順はもう忘れました。
多分下記ページの右上の「SIGN UP」から見たまんま進めていけば大丈夫です。
アプリケーションの作成
管理コンソールの「Applications」タブで「Create your first application now」をクリックします。
「PHP 5.4」をクリックします。「PHP 5.4 with Zend Server 6.1」なんてのもありますが Zend Server 使ったことないのでスルーします。
「Public URL」を適用に入力して「Create Application」をクリックします。とりあえず「example」としました。
チェックアウト
管理コンソールのアプリの画面に git の URL が表示されているので、コピペしてローカルに clone します。
$ git clone ssh://......rhcloud.com/~/git/example.git/
チェックアウトすると幾つかのディレクトリが含まれていますが、php ディレクトリがドキュメントルートです。
適当なコードを追加します。
<?php echo "Hello OpenShift.";
コミットしてプッシュします。いかにもデプロイしてますー的なメッセージが流れます。
$ git add php/hello.php $ git commit -m first $ git push Counting objects: 6, done. Delta compression using up to 6 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 390 bytes | 0 bytes/s, done. Total 4 (delta 1), reused 0 (delta 0) remote: Stopping PHP 5.4 cartridge (Apache+mod_php) remote: Waiting for stop to finish remote: Building git ref 'master', commit fde8df8 remote: Checking deplist.txt for PEAR dependency.. remote: Preparing build for deployment remote: Deployment id is 418adf64 remote: Activating deployment remote: Starting PHP 5.4 cartridge (Apache+mod_php) remote: ------------------------- remote: Git Post-Receive Result: success remote: Activation status: success remote: Deployment completed with status: success
アプリの画面を表示してみます。"Hello OpenShift." と表示されればデプロイは成功です。
https://example-<your_domain>.rhcloud.com/hello.php
MySQL
無料枠で MySQL も使えるので使ってみました。
アプリケーションの管理コーンソールから「Add MySQL 5.5」をクリックして MySQL を追加します。
接続情報は次の環境変数で得られます。
OPENSHIFT_MYSQL_DB_HOST
OPENSHIFT_MYSQL_DB_PORT
OPENSHIFT_MYSQL_DB_USERNAME
OPENSHIFT_MYSQL_DB_PASSWORD
アプリからは次のように接続できます。
<?php $host = $_SERVER['OPENSHIFT_MYSQL_DB_HOST']; $port = $_SERVER['OPENSHIFT_MYSQL_DB_PORT']; $user = $_SERVER['OPENSHIFT_MYSQL_DB_USERNAME']; $pass = $_SERVER['OPENSHIFT_MYSQL_DB_PASSWORD']; $pdo = new \PDO("mysql:host=$host;port=$port;dbname=example;charset=utf8", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, )); $stmt = $pdo->prepare("select 123"); $stmt->execute(); var_dump($stmt->fetchAll());
コミットしてプッシュします。
$ git add php/db.php $ git commit -m mysql $ git push
アプリの画面を表示します。それっぽいものが表示されれば成功です。
https://example-<your_domain>.rhcloud.com/db.php
Composer とマイグレーション
次はデプロイ時に DB のマイグレーションが行なわれるようにしてみます。
マイグレーションのために composer で phpmig をインストールします。
$ composer require "davedevelopment/phpmig:*" $ vendor/bin/phpmig init $ vendor/bin/phpmig generate first
phpmig の init と generate でマイグレーションの雛形が作成されているので修正します。
phpmig.php
<?php use \Phpmig\Adapter; $host = $_SERVER['OPENSHIFT_MYSQL_DB_HOST']; $port = $_SERVER['OPENSHIFT_MYSQL_DB_PORT']; $user = $_SERVER['OPENSHIFT_MYSQL_DB_USERNAME']; $pass = $_SERVER['OPENSHIFT_MYSQL_DB_PASSWORD']; $pdo = new \PDO("mysql:host=$host;port=$port;dbname=example;charset=utf8", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, )); $container = new ArrayObject(); $container['phpmig.adapter'] = new Adapter\PDO\Sql($pdo, 'phpmig'); $container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations'; $container['db'] = $pdo; return $container;
migrations/20140211215144_first.php
<?php class First extends Phpmig\Migration\Migration { public function up() { /* @var $pdo PDO */ $pdo = $this->container['db']; $pdo->query('CREATE TABLE t ( id int not null primary key, name varchar(255) not null )'); $pdo->query("INSERT INTO t VALUES (1, 'ore')"); $pdo->query("INSERT INTO t VALUES (2, 'are')"); $pdo->query("INSERT INTO t VALUES (3, 'sore')"); } public function down() { /* @var $pdo PDO */ $pdo = $this->container['db']; $pdo->query("DROP TABLE t"); } }
アプリのコードを修正します。
<?php $host = $_SERVER['OPENSHIFT_MYSQL_DB_HOST']; $port = $_SERVER['OPENSHIFT_MYSQL_DB_PORT']; $user = $_SERVER['OPENSHIFT_MYSQL_DB_USERNAME']; $pass = $_SERVER['OPENSHIFT_MYSQL_DB_PASSWORD']; $pdo = new \PDO("mysql:host=$host;port=$port;dbname=example;charset=utf8", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, )); $stmt = $pdo->prepare("select * from t"); $stmt->execute(); var_dump($stmt->fetchAll());
ここまでのコードをコミットします。
$ echo '/vendor' > .gitignore $ git add . $ git commit -m phpmig
後はデプロイ時に composer install と phpmig migrate が実行されればいいのですが、OpenShift にはデプロイ時に処理を入れるために Action Hooks という仕組みがあります。
リポジトリの .openshift/action_hooks/ にフックしたいアクション名のシェルスクリプトを作成しておくと、そのタイミングで実行されます。
.openshift/action_hooks/deploy
#!/bin/bash echo "Starting deploy script" set -eux cd $OPENSHIFT_REPO_DIR curl -sS https://getcomposer.org/installer | php php composer.phar install --no-dev vendor/bin/phpmig migrate
スクリプトからはいろいろな環境変数にアクセスできます。このスクリプトでは $OPENSHIFT_REPO_DIR
でデプロイ先のディレクトリに移動しています。
スクリプトのパーミッションを設定してコミット、プッシュします(Windows でやったので git update-index していますが Linux なら chmod でいいです)。
$ git add .openshift/action_hooks/* $ git update-index --chmod=+x .openshift/action_hooks/* $ git commit -m "Add action_hooks/deploy" $ git push
アプリの画面を表示します。それっぽいものが表示されれば成功です。
https://example-<your_domain>.rhcloud.com/db.php