RedHat OpenShift で PHP を使う

はじめに

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/hello.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/db.php

<?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/db.php

<?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

参考