GoogleAppEngineでPHPアプリケーションを構築してみる

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー
SEGAさん、DIVAの筐体ください(ズザー

前回

Google App Engine 入門 (PHP)

前回は、GAEの方で自動生成される簡易コードでデプロイから表示確認までおこないました。
今日は、composerなども用いた多少本格的なアプリケーションの動作確認をできればいいなと思っています。
それではいってみましょう!

簡易アプリケーション構築

フレームワーク準備

手前味噌で申し訳ないですが、Samurai Frameworkを使用させていただきます。
composerを使用して利用できるので、symfonyやlaravelその他のフレームワークでも基本的な手順や利用方法としては変わらないはずです。

1
2
3
4
5
6
7
8
9
10
11
12
13
# デフォルトアプリケーションをclone
$ git clone git@github.com:samurai-fw/samurai-standard-app.git sample
$ cd sample

# 書き込み権限だけ付与
$ chmod a+w App/Log App/Temp

# 依存ライブラリインストール
$ composer install

# ローカルでの動作を確認
# 5.4以上のphpがインストールされている事が前提です
$ ./App/app s

ブラウザで「 http://localhost:8888/ 」にアクセスしてアプリケーションの挙動を確認してみます。

うん。問題ないですね!
ローカルでは正常にアプリが動作しています。

GAE用の設定ファイルを用意

つづいて、GAE用の設定ファイルを用意します。

app.yaml

1
2
3
4
5
6
7
8
application: sample
version: 1
runtime: php55
api_version: 1

handlers:
- url: /.*
  script: App/Web/index.php

GAEで使用を制限されている関数を登録

GAEではセキュリティ上の観点から、いくつかの関数が制限されています。 その解除を行う必要があります。

php.ini

1
google_app_engine.enable_functions = "php_sapi_name"

GAEではファイルの書き込みに関して制限があるため、キャッシュ設定を一時OFFに

正直なところ、今回このポイントでかなり躓きました。
まず、エラーが出力されない状況が痛かったですね…。

おそらく、error出力関係の設定の問題だとは思うのですが、display_errorsをonにして、画面上に出力されるエラーから問題に対応して、という流れを辿りました。

つまるところ、twigのキャッシュ生成部分でエラーが起きていたので、一旦twigのキャッシュ生成をoffにして対処です。

App/Config/Initializer/Renderer.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace App\Config\Initializer;

use Samurai\Samurai\Application as SamuraiApplication;
use Samurai\Samurai\Component\Core\Initializer;
use Samurai\Samurai\Component\Renderer\Renderer as SamuraiRenderer;

class Renderer extends Initializer
{
    /**
     * {@inheritdoc}
     */
    public function configure(SamuraiApplication $app)
    {
        $app->config('renderer.initializers.app', function(SamuraiApplication $app, SamuraiRenderer $renderer) {
            $this->initialize($app, $renderer);
        });
    }

    public function initialize(SamuraiApplication $app, SamuraiRenderer $renderer)
    {
        $engine = $renderer->getEngine();
        $engine->setCache(false);
    }
}

このコードを、GAEにデプロイ

デプロイコマンドは前回と一緒です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ appcfg.py -A [project-id] update sample
05:18 PM Application: [project-id]; version: 1
05:18 PM Host: appengine.google.com
05:18 PM
Starting update of app: [project-id], version: 1
05:18 PM Getting current resource limits.
05:18 PM Scanning files on local disk.
05:18 PM Scanned 500 files.
05:18 PM Scanned 1000 files.
05:18 PM Scanned 1500 files.
05:18 PM Scanned 2000 files.
05:18 PM Cloning 2361 application files.
05:18 PM Cloned 2000 files.
05:19 PM Uploading 402 files and blobs.
05:20 PM Uploaded 402 files and blobs.
05:20 PM Compilation starting.
05:20 PM Compilation completed.
05:20 PM Starting deployment.
05:20 PM Checking if deployment succeeded.
05:20 PM Deployment successful.
05:20 PM Checking if updated app version is serving.
05:21 PM Completed update of app: [project-id], version: 1

デプロイ後は、Developers Console上でもApp Engineに関する情報を確認できるようになります。

アプリケーションに割り当てられるURLからアクセスをすると…。

ばっちりです。 composerでインストールしたライブラリ群も全て上がって、正常に動作しているようです。

懸念点

デプロイに関して

まだGAEの全貌が見えていない状況ですが、現段階での懸念としては、ローカル環境のコードをアップするスタイルなので、 グループ開発になった際に、デプロイ時になにかしらの問題が起きないかが心配です。

開発環境、商用環境の棲み分け

GAEでは、プロジェクトに対して、一つのインスタンスが割当てられていると思われます。 もし、サンドボックス環境やその他開発環境などを商用とは別に用意する必要性がある場合、どのように対応するのかまだ自分の中で見えていません。 Google Compute Engineなどを使っていく事になるのでしょうか?

とはいえ、便利は便利です。 AWSに比べて、インフラ側がほぼ自動化されているので、一度設定されてしまえば、アプリケーション開発にすぐに専念できます。

次回は、GAE上でのredisやmemcachedなどのアプリケーション利用に関して挑戦したいと思います。