まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:php

PHP からエクセルフォーマットのファイルを扱えるようにするための PHPExcel を使ってみました。備忘録としてその手順を記録しておきます。

まず、PHPExcel の最新版をダウンロードサイトから選択してダウンロードします。2016/Jan/10 時点での最新版のバージョンは 1.8.0 でした。以下、このバージョンを使う前提で紹介します:
2016011001


ダウンロードしたファイル(PHPExcel_1.8.0_doc.zip)を適当なフォルダに展開します。ファイル内にはドキュメントなども含まれていますが、実際に PHP から利用する際に必要なファイルは全て Classes フォルダ内にあるので、実環境ではこのフォルダ以下のファイルだけがあれば一応動きます:
2016011002


次に実際にアクセスする先のエクセルファイルを用意します。今回は Excel97-2003 フォーマット(拡張子 .xls)の、このようなブックファイル(Book1.xls)を用意しました。同じもので良ければこちらこちらからダウンロードしてください。なお PHPExcel 自体は Excel 2007 フォーマット(拡張子 .xlsx)を扱うことも可能です。今回はどちらのファイルにも対応させてみます:
2016011003


なお、今回用意したブックファイルは上記のようにシートが3枚あり、そのうちの1枚目のシートに表が作られています。また表内では日本語が使われていたり、セルの色属性や計算式などの機能も使われています。

ではこの Book1.xls を PHPExcel で読み込んでみましょう。以下の様な PHP ファイルを用意します:
<?php
//. PHPExcel ライブラリの読み込み
include_once( dirname( __FILE__ ) . '/Classes/PHPExcel.php' );
include_once( dirname( __FILE__ ) . '/Classes/PHPExcel/IOFactory.php' );

//. endsWith 関数の定義
function endsWith( $str, $suffix ){
  $len = strlen( $suffix );
  return $len == 0 || substr( $str, strlen( $str ) - $len, $len ) === $suffix;
}

//. 対象ファイル名
$excelfilename = 'Book1.xls';
$excelfilepath = dirname( __FILE__ ) . '/' . $excelfilename;

//. ファイル拡張子によってリーダーインスタンスを変える
$reader = null;
if( endsWith( $excelfilename, 'xls' ) ){
  $reader = PHPExcel_IOFactory::createReader( 'Excel5' );
}else if( endsWith( $excelfilename, 'xlsx' ) ){
  $reader = PHPExcel_IOFactory::createReader( 'Excel2007' );
}

if( $reader ){
  //. エクセルファイルを読み込む
  $excel = $reader->load( $excelfilepath );
  echo $excel->getSheetCount(); //. シート数を取得
  echo "<br/>";

  //. Formulaを計算する指定でアクティブシートの内容を取得する
  $obj1 = $excel->getActiveSheet()->toArray( null, true, true, true );
  var_dump($obj1);
  echo "<br/>";

  //. Formulaを計算しない(式を式のままにする)指定でアクティブシートの内容を取得する
  $obj2 = $excel->getActiveSheet()->toArray( null, false, true, true );
  var_dump($obj2);
  echo "<br/>";
}else{
  echo "No reader.";
}
?>

そして、この PHP ファイルを HTTP のドキュメントルート以下に用意し、更に同じフォルダにエクセルファイル(Book1.xls)と PHPExcel ライブラリの Classes フォルダを用意した上で、この PHP ファイルにブラウザからアクセスするとこんな結果になりました:
2016011004


この結果を見やすく整形するとこんな感じ↓です:
3

array(6) {
 [1]=> array(4) {
  ["A"]=> string(1) "A"
  ["B"]=> string(1) "B"
  ["C"]=> string(3) "計"
  ["D"]=> string(6) "平均"
 }
 [2]=> array(4) {
  ["A"]=> float(1)
  ["B"]=> float(20)
  ["C"]=> float(21)
  ["D"]=> float(10.5)
 }
 [3]=> array(4) {
  ["A"]=> float(3)
  ["B"]=> float(31)
  ["C"]=> float(34)
  ["D"]=> float(17)
 }
 [4]=> array(4) {
  ["A"]=> float(2)
  ["B"]=> float(44)
  ["C"]=> float(46)
  ["D"]=> float(23)
 }
 [5]=> array(4) {
  ["A"]=> float(5)
  ["B"]=> float(2)
  ["C"]=> float(7)
  ["D"]=> float(3.5)
 }
 [6]=> array(4) {
  ["A"]=> float(11)
  ["B"]=> float(97)
  ["C"]=> float(108)
  ["D"]=> float(54)
 } 
} 

array(6) {
 [1]=> array(4) {
  ["A"]=> string(1) "A"
  ["B"]=> string(1) "B"
  ["C"]=> string(3) "計"
  ["D"]=> string(6) "平均"
 }
 [2]=> array(4) {
  ["A"]=> float(1)
  ["B"]=> float(20)
  ["C"]=> string(6) "=A2+B2"
  ["D"]=> string(5) "=C2/2"
 }
 [3]=> array(4) {
  ["A"]=> float(3)
  ["B"]=> float(31)
  ["C"]=> string(6) "=A3+B3"
  ["D"]=> string(5) "=C3/2"
 }
 [4]=> array(4) {
  ["A"]=> float(2)
  ["B"]=> float(44)
  ["C"]=> string(6) "=A4+B4"
  ["D"]=> string(5) "=C4/2"
 }
 [5]=> array(4) {
  ["A"]=> float(5)
  ["B"]=> float(2)
  ["C"]=> string(6) "=A5+B5"
  ["D"]=> string(5) "=C5/2"
 }
 [6]=> array(4) {
  ["A"]=> string(11) "=SUM(A2:A5)"
  ["B"]=> string(11) "=SUM(B2:B5)"
  ["C"]=> string(11) "=SUM(C2:C5)"
  ["D"]=> string(5) "=C6/2"
 } 
} 

1行目の「3」はシート数なので、これは正しく取得できていることがわかります。

2行目から始まるブロックは1枚目のシートの中身を「Formula を計算して」取得したものです。つまり計算式が定義されていた場合はその計算結果が取得できていることになるのですが、例えば C2 セルは A2 と B2 の和(=A2+B2)が定義されていましたが、正しく計算結果が取得できていることがわかります。

またその下には1枚目のシートの中身を「Formula をそのまま」取得したものが出力されています。C2 セルの内容が "=A2+B2" となっていることが確認でき、これも期待通りに動いていたことが確認できました。


PHPExcel はファイルの読み込みだけでなく、Excel ファイルとして出力することも出来て、(CSV や TSV ではない)エクセル連携をする際に便利に使えそうなライブラリです。


前回の続きです:
Bluemix のビルドパックを作る(1/3)


このシリーズは3回に分けて IBM Bluemix 用のビルドパックをゼロから作成する手順を説明するもので、今回はその2回目です:
(1) ビルドパックを作る上で知っておくべきこと
(2) ビルドパックを作るための準備作業      ←今回はここ
(3) ビルドパックを作成して、実際に動作確認


前回は、ビルドパックを作成する上で知っておくべき仕組みや制限事項についてをまとめました。おおまかには次のような仕組み/条件でビルドパックを作ります:
- ビルドパック自体は detect, compile, release の3つのスクリプトからなる。
- これら3つのスクリプトは一般ユーザー権限で実行される。su や sudo は使えない。
- 素の Ubuntu Linux に対して、これら3つのスクリプトが実行された後に必要な環境が整っているようにする。

今回と次回の2回に分けて、実際にビルドパックをゼロから作成します。正確には実際にビルドパックそのものを作る手順は次回紹介しますが、今回はそのための準備作業を紹介します。具体的には実際にビルドパックを作るスクリプトは一般ユーザー権限でしか実行できないため、ビルドなどの root 権限が必要な作業はあらかじめ(Ubuntu 環境下で)済ませておく必要があります。そのための作業の説明を今回のブログエントリの中で紹介します。

また、今回作成するビルドパックの内容は「比較的緩めな日本語対応 PHP アプリケーションサーバーを作る」こととします。具体的には以下の様なスペック PHP アプリケーションサーバーのビルドパックを作ります:
・ PHP 5.6.14
・ Apache HTTPD 2.4.16
・ PHP の MySQL モジュールと Postgresql モジュールを追加
・ PHP の設定は日本語 UTF-8 ベースで、エラー発生時のエラー内容を出力、ファイルアップロードは1ファイル10MB まで許可、・・・などなど php.ini を緩めに設定
・ Apache HTTPD も .htaccess での設定上書きを許可するなど、ゆるゆるにする

簡単にいえば「php.ini と httpd.conf を緩めに設定するような環境で PHP のビルドパックを作成する」ということです。


では本エントリでの作業に入ります。まずは 64bit の Ubuntu Linux 14.02 環境を用意します。デスクトップ環境は必須ではありません。SSH 等でログインしてターミナル上での操作ができれば大丈夫です:
2015100900



この Ubuntu の中に PHP と Apache HTTPD 環境を構築していきます。といっても、ただインストールすればいいというわけではありません。インストールだけなら "sudo apt-get install php5 apache2 libapache2-mod-php5" とかを実行すればいいのですが、これは sudo が使える前提での話です。上記のようにビルドパック作成時の権限は sudo の使えないユーザー権限なので、この apt-get による簡単なインストール方法は使えないのです。

ではどうするか? その答は (2) まず Ubuntu 内で必要なモジュールを、ソースからのコンパイルなど全て手作業で作り、 (3) 作ったモジュールを tar などでまとめておき、ビルドパック作成時は一般ユーザーが展開してコピーすればよい、という状態にしておく 必要があるのでした。要は root 権限が必要な部分((2))と、不要な部分((3))に作業を分断し、ビルドパック作成時は root がなくてもできる作業だけを行います。そしてそのような作業だけで済むように、root 権限が必要な作業は(ビルドパック作成作業の前)あらかじめ済ませてまとめておく、という作業を行うようにします。これが全体作業でいうところの (2) と (3) を分けた理由でもあります。

では、あらためて今回行う作業の内容をまとめておきます:
(2-1) Apache HTTPD 2.4.16 をソースからビルドして /app/apache/ 以下にインストール
(2-2) PHP 5.6.14 をソースからビルドして /app/php/ 以下にインストール
(2-3) 出来上がった Apache HTTPD 2.4.16 および PHP 5.6.14 のモジュールを /app/apache/ および /app/php/ 以下からそれぞれ取り出してアーカイブ

こうして出来上がったアーカイブファイルは、Ubuntu 環境の /app/apache/ & /app/php/ 以下であれば動くように作られているので、同じ状態を作り出すようにビルドパックを構成(次回)すればよい、ということになります。今回はそのための準備を行います。


では具体的な作業手順の説明です。まずは Ubuntu 14.02(64bit) のターミナル環境に SSH 等でログインします:
2015100901


まずは作業ディレクトリを作成します。今回は /tmp/build を作業ディレクトリとします:
$ mkdir -p /tmp/build
$ cd /tmp/build


(2-1) Apache HTTPD 2.4.16 のソースコード一式をダウンロードし、作業ディレクトリ内に展開します:
$ curl -L http://www.carfab.com/apachesoftware/httpd/httpd-2.4.16.tar.gz | tar xzf -


Apache HTTP のビルドに必要な apr-1.5.2 および apr-util-1.5.2 をそれぞれダウンロードし、作業ディレクトリ内の srclib/ ディレクトリ内に展開します:
$ cd httpd-2.4.16/srclib
$ curl http://www.us.apache.org/dist/apr/apr-1.5.2.tar.gz | tar xzf -
$ mv apr-1.5.2 apr
$ curl http://www.us.apache.org/dist/apr/apr-util-1.5.4.tar.gz | tar xzf -
$ mv apr-util-1.5.4 apr-util
$ cd ..


Apache HTTP のビルドに必要なライブラリ(libpcre3, libpcre3-dev)を apt-get で入手します:
$ sudo apt-get install libpcre3 libpcre3-dev


Apache HTTP ビルド後のインストールディレクトリを /app/apache/ とする前提でビルド(configure して make して make install )します:
$ ./configure --prefix=/app/apache --with-included-apr --enable-rewrite
$ sudo mkdir -p /app/apache
$ sudo chmod -R 777 /app/
$ make && make install


(2-2) PHP インストール先のディレクトリ(/app/php/)を用意します:
$ sudo mkdir -p /app/php


(2-1) の作業でビルドしたモジュールの一部を PHP のライブラリとしてコピーします:
$ sudo mkdir -p /app/php/ext
$ sudo chmod -R 777 /app/php
$ cp /app/apache/lib/libapr-1.so.0 /app/php/ext
$ cp /app/apache/lib/libaprutil-1.so.0 /app/php/ext
$ cd /app/php/ext
$ ln -s libapr-1.so.0 libapr-1.so
$ ln -s libaprutil-1.so.0 libaprutil-1.so


PHP のビルドに必要なライブラリ(libxml2, libxml2-dev, libssl-dev, ...)を apt-get で入手します。平行して PostgreSQL をサポートするために必要な環境を整えます:
$ cd /tmp/build
$ sudo echo “deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main”> /etc/apt/sources.list.d/pgdg.lis
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc |  sudo apt-key add -OK
$ sudo apt-get update
$ sudo apt-get install libxml2 libxml2-dev libssl-dev libvpx-dev libjpeg-dev libpng12-dev libXpm-dev libbz2-dev libmcrypt-dev libcurl4-openssl-dev libfreetype6-dev postgresql-server-dev-9.4


PHP のソースコード一式をダウンロードし、作業ディレクトリ内に展開します:
$ curl -L http://php.net/get/php-5.6.14.tar.gz/from/us1.php.net/mirror | tar xzf -


PHP ビルド後のインストールディレクトリを /app/php/ とする前提でビルド(configure して make して make install )します:
$ cd php-5.6.14
$ ./configure --prefix=/app/php --with-apxs2=/app/apache/bin/apxs --with-mysqli --with-pdo-mysql --with-pgsql --with-pdo-pgsql --with-iconv --with-gd --with-curl=/usr/lib --with-config-file-path=/app/php --enable-soap=shared --enable-libxml --enable-simplexml --enable-session --with-xmlrpc --with-openssl --enable-mbstring --with-bz2 --with-zlib --with-gd --with-freetype-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-xpm-dir=/usr/lib
$ make && make install


MySQL クライアントライブラリを apt-get で入手して、PHP / Apache のライブラリとしてコピーします:
$ sudo apt-get install libmysqlclient-dev
$ cd /app/php/ext
$ cp /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0 ./
$ ln libmysqlclient.so.18.0.0 libmysqlclient.so.18
$ ln libmysqlclient.so.18.0.0 libmysqlclient.so
$ cp /tmp/build/php-5.6.14/.libs/libphp5.so /app/apache/modules/


(2-3) コンパイルが終了した Apache HTTP のモジュールをアーカイブします:
$ cd /app
$ echo '2.4.16' > apache/VERSION
$ tar -zcvf apache-2.4.16.tar.gz apache


コンパイルが終了した PHP のモジュールをアーカイブします:
$ echo '5.6.14' > php/VERSION
$ tar -zcvf php-5.6.14.tar.gz php




これで (2) の作業が完了して、ビルドパックを作るための作業準備が整いました。今回の作業で出来上がった apache-2.4.16.tar.gz および php-5.6.14.tar.gz はどちらも /app/ 以下にコピーすれば正しく動く前提で作られているので、これらのモジュールを使い、この条件でビルドパックを作ってあげればよい、ということになります。

次回はいよいよ実際にビルドパックを作って、動作確認までしてみます。ゴールは目前!


(注 2015/Oct/16 追記)
続きはこちら

 

2日ほど泥沼にハマって抜け出せなくなっていた問題が解決できたので、その謎を共有します。

元々はこんなシステムを PHP で作ろうとしていました:
 - 画像をアップロードできる
 - アップロード画像は ID を付与した上で MySQL の BLOB (バイナリ・ラージ・オブジェクト)として格納する
 - ID を指定して、アップロード済みの画像を表示させることができる

自分自身でも Java では何度も作ったことのある仕組みで、その PHP 版を作ろうとしただけでした。

いざ作って動かしてみると、アップロードは成功します。でも表示時に画像が壊れてしまい、うまく表示できないのです。この原因究明と解決に時間を使ってしまいました。


もう少し詳しく状況を説明します。調べていくうちに同じ現象が MySQL を使わなくても再現できることがわかったので、話をシンプルにするために MySQL なしで説明します(実際にはこの切り分けも簡単ではなかった)。

ソースコードはこんな感じ。同一ディレクトリにある bmxug148.png というファイルのバイナリコンテンツ(元々のコードでは MySQL の BLOB に格納されていたもの)を取り出して、PNG 画像用の HTTP ヘッダを指定して echo でバイナリをそのまま出力しています:
<?php
$img = file_get_contents("./bmxug148.png");
header('Content-Type: image/png');
echo $img;
?>

この PHP ファイルをブラウザから呼び出すと、画像が表示・・・されることを期待していたのに、画像が壊れてしまっている旨のメッセージが表示されてしまいます(FireFox で確認した場合):
2015100202


こういう状況だと、表示側の PHP スクリプトに問題があるのか、それともアップロードしたファイルバイナリデータの格納時に既に壊れてしまっているのかすらわかりません。まあ、上記のシンプルなスクリプトでも再現するということは前者ということになるのですが、それが分かったのは相当後になってのことです。


で、とりあえずこの「壊れた画像バイナリ」を無理やり取り出してファイルとして保存し、バイナリエディタで開いてみました。そこで分かったのは画像の最初3バイトに PNG 画像としてふさわしくない情報が追加されていた、ということです:
2015100203


0xEF, 0xBB, 0xBF という3バイトが余分です(4バイト目から本来の PNG 画像のヘッダが始まっています)。4バイト目から表示されていれば正しく表示できそうなのですが、ではこの最初の3バイトはどこで付与されてしまったのでしょう? DB への格納時の処理を疑うこともできたのですが、この EF BB BF という3バイトの組みあわせ、どこかで見たことありました。。

ちょっと調べると分かるのですが、これは BOM(Byte Order Mark) と呼ばれる符号で、テキストが Unicode で記述されていることと、その符号化の種類を示すものです。で、UTF-8 の場合の BOM がまさにこの 0xEF 0xBB 0xBF の3バイトなのです。


つまり、実はもとの PHP ファイルそのものが UTF-8 で記述されていて、しかも BOM 付きでファイルが保存されていたことが直接の原因だったのでした。このため、ブラウザでこのファイル実行した場合も、最初に 0xEF 0xBB 0xBF の3バイトは(PHP ファイルの一部として)返ってきて、次に PHP で処理した結果の画像バイナリが続いていた、ということになります:
2015100201


画像の情報は正しく返っていたのに、その前に画像とは関係のない3バイトが送られてきていたため、「画像としては壊れている」と判断された、ということです:
2015100202


したがって、解決策は PHP ファイルを BOM なしで保存することです:
2015100204


この PHP をブラウザから実行すれば、本来の正しい画像が表示されるようになります:
2015100205


あー、よかった。
 

243 ゲームをご存知でしょうか?
2015092901


2048 ゲームは(そこそこ)有名だと思いますが、そのクローンゲームです。2048 ゲームは以下のルールで遊ぶものです:
(1) 矢印キーを使って、画面内のタイルを4方向にスライドさせる
(2) 同じ数字のタイルをぶつけると、数字が倍の1つのタイルができる
(3) ぶつけて出来上がったタイルの数字が得点になる(2048 タイルを作ることが1つの目標)


243 は 2048 と異なり、3つの同じ数字を重ねることで1つにまとまります。2048 よりは難易度高くなっています。具体的なルールは以下になります:
(1) 矢印キーを使って、画面内のタイルを4方向にスライドさせる
(2) 同じ数字のタイルを3つぶつけると、数字が3倍の1つのタイルができる
(3) ぶつけて出来上がったタイルの数字が得点になる(243 タイルを作ることが1つの目標)



で、このゲームの HTML5 が Github 上で公開されていました。これを使って IBM Bluemix 上で 243 ゲーム環境を作ってみます(まあ、特にトリッキーなこともないんですが・・)。

まず Bluemix 上に 243 ゲームが動くランタイムを作成します。サーバーサイドで動くモジュールがないので、Github の staticfile ビルドパックを使っても動くと思いますが、Bluemix ダッシュボードから PHP ランタイムを選んでも(事実上 PHP を使わないので、かなり贅沢な環境ですが)動きます。今回は PHP ランタイムを使う方向でいきましょう:
2015092902


並行して 243 ゲームの zip モジュールを GitHub からダウンロードします:
2015092903


ダウンロードした zip モジュールを展開します。index.html が存在するディレクトリがドキュメントルートになります:
2015092904


ここまでできたら、cf コマンドラインツールを使って、このドキュメントルートを PHP ランタイムにプッシュするだけ、です:
# cd (展開した index.html があるディレクトリ) ドキュメントルートへ移動
# cf login -a https://api.ng.bluemix.net/    cf で Bluemix にログイン(米国DCの場合)
# cf push (PHP ランタイムの名前)        cf で Bluemix に 243 ゲームをプッシュ

プッシュが成功したら、PHP ランタイムの URL にブラウザからアクセスすると 243 ゲームが始まります:
2015092905


ぎゃー、惜しかったけど無理。難しい!!

IBM Bluemix の PHP ランタイムと MySQL サービスを使った環境上に、オープンソース CMS の Drupal をインストーする手順を紹介します。


まずは公式サイトのダウンロードページから、Drupal の最新版をダウンロードします。2015/07/02 時点では 7.38 が最新バージョンでした。このブログエントリでも 7.38 を使う前提で紹介します(ダウンロードファイル名は drupal-7.38.tar.gz):
http://drupal.jp/core_download


まずは専用の空フォルダを1つ用意します。この例では C:\tmp\docroot というフォルダを新たに作りました。このフォルダが PHP サーバーのドキュメントルートとなります。この下にダウンロードファイルを drupal というフォルダ名で展開します:
2015070201


ちょっとだけ Drupal モジュールを変更します。実は drupal フォルダ内の .htaccess ファイルがあると Bluemix 上では正しく動作しません。このファイルを _htaccess とリネームします:
2015070202


次に Drupal を Bluemix 上の PHP ランタイムで正しく動かすための追加設定をします。ドキュメントルートのディレクトリ下に composer.json というファイルと .bp-config というフォルダを作り、.bp-config の下に options.json というファイルを、それぞれ以下の内容で追加します:

(composer.json)
2015070203

{}

(.bp-config\options.json)
2015070204

{
  "PHP_EXTENSIONS": [ "bz2", "zlib", "curl", "mcrypt", "mbstring", "mysql", "pdo", "pdo_mysql", "gd" ]
}

options.json では PHP に追加する拡張モジュールを指定しています。Drupal に必要な mbstring, mysql, gd などを追加しています。

これでソースコード側の準備は完了です。では Bluemix 側の環境を作ります。この先の PHP ランタイムを作って MySQL サービスを追加する部分、およびこの後に使う cf ツールの詳しいインストール手順に関してはこちらの記事を参照ください:
http://dotnsf.blog.jp/archives/1032618388.html


では Bluemix にログインして、PHP ランタイムを1つ作成します。この例では dotnsf-drupal という名前を付けていますが、ここは利用される方それぞれに変えてください(同じ名前は使えません):
2015070205


このランタイムに MySQL サービスを追加します:
2015070206


MySQL ランタイム追加後に PHP ランタイムの環境変数を参照して、追加した MySQL サービスにアクセスするための接続情報が書かれた JSON テキストを確認します。この内容は後で Drupal セットアップ時に使うので、コピペなどで手元に用意しておきます:
2015070207


そして、先程ローカルマシンに用意した Drupal 環境をこの Bluemix ランタイム上にプッシュ(転送)するための cf コマンドラインツールをダウンロードしてインストールします:
https://github.com/cloudfoundry/cli#downloads


Drupal をただ使うだけであれば必須ではありませんが、もし必要であればここで phpMyAdmin などの管理系ツールもドキュメントルート以下に用意しておきます。


インストールした cf コマンドラインツールを使って Drupal 環境を Bluemix ランタイム上にプッシュします。Windows であればコマンドラインプロンプトを開き、このドキュメントルートとみなしたフォルダに移動して、プッシュコマンドを実行します:
> cd c:\tmp\docroot

(ドキュメントルートに移動)
> cf login -a https://api.ng.bluemix.net
(Bluemix のユーザーIDとパスワードを聞かれるので入力する)
> cf push dotnsf-drupal

(作成時に指定したアプリケーション名を指定してプッシュ)

プッシュが終わったら、ウェブブラウザで http://(作成した PHP ランタイムのホスト名)/drupal/ にアクセスしてみます。Drupal の初期インストール画面になれば成功です!

では順を追って初期インストール手順を紹介します。まず最初の "Choose profile" セクションでは "Standard" を選択して "Save and continue" をクリックします:
2015070201


次の "Choose language" では言語を指定します。今回はデフォルトの英語リソース以外をインストールしていないので "English (build-in)" が選択されているはずです。このまま "Save and continue" をクリックします。ここまでは通常の Drupal 導入手順と何も変わりません:
2015070202


次の "Set up database" では接続先データベースを指定します。上述の環境変数をコピペした時の情報を使ってデータベース名("name" の値)、接続ユーザー名("username" の値)、接続パスワード("password" の値)をそれぞれ入力します。またデフォルトでは Drupal のデータベースは localhost にある前提になっていますが、Bluemix 環境では MySQL は別サーバーなので "ADVANCED OPTIONS" をクリックして MySQL サーバーの指定も追加します:
2015070203


こちらでも上述の環境変数をコピペした時の情報を使ってホスト名("hostname" の値)、ポート番号("port" の値)を入力します。最後に "Save and continue" をクリックします:
2015070204


インストール中です、しばらく待ちます:
2015070205


最後 "Configure site" ではサイトの設定を行います。サイト名、メールアドレス、管理用ユーザー名とそのパスワードを指定します。そのまま下へスクロールします:
2015070206


スクロール後、国名とタイムゾーンを指定して "Save and continue" をクリックします:
2015070207


これで設定完了です!
2015070208


改めてウェブブラウザで http://(作成した PHP ランタイムのホスト名)/drupal/ にアクセスすると、設定済みの Drupal ページが表示されるはずです:
2015070209


というわけで Drupal も動きました!

 

このページのトップヘ