Google App Engine で PHP を使う

昨年の 10 月ごろに Google App Engine for PHP がオープンになったらしいので触ってみました。

SDK のインストール

まずはローカルでアプリを実行したり Google App Engine へデプロイするために必要な SDK をインストールします。

Python 2.7

普段使っている CentOS 6 の python だと 2.6 系で古いので、pyenv で 2.7 系をインストールします。

$ cd
$ git clone git://github.com/yyuu/pyenv.git .pyenv
$ vi .bashrc

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

$ exec $SHELL
$ pyenv install --list
$ pyenv install 2.7.5
$ pyenv local 2.7.5
$ pyenv rehash

PHP 5.4

SDK でアプリをローカルで実行するためには PECL の Memcache や Memcached 拡張がインストールされているとダメです。

phpenv/php-build で普通にインストールすれば Memcache や Memcached は含まれないので、PHP も phpenv/php-build でインストールします。

Google App EnginePHP は 5.4 なので 5.4 をインストールします。

$ cd
$ curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | sh
$ git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build
$ vi .bashrc

export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

$ exec $SHELL
$ phpenv install --list
$ phpenv install 5.4.25
$ phpenv local 5.4.25
$ phpenv rehash

SDK

SDK をインストールします。ダンロードして展開するだけです。

$ cd
$ wget http://googleappengine.googlecode.com/files/google_appengine_1.8.9.zip
$ unzip google_appengine_1.8.9.zip

サンプルアプリの作成

サンプルアプリを作成します。

mkdir helloworld
cd helloworld

helloworld.php

<?php
echo "Hello, World!";

App Engine のアプリケーション設定ファイルを作成します。 このファイルでアプリの識別子やランタイム(PHP)や URL のマッピングを記述します。

app.yaml

application: helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /.*
  script: helloworld.php

SDK を使ってサンプルアプリをローカルで実行します。

$ cd
$ google_appengine/dev_appserver.py --host=0.0.0.0 --php_executable_path=~/.phpenv/shims/php-cgi helloworld/

http://localhost:8080/ をブラウザで開くとサンプルアプリの画面が表示されます。

サンプルアプリのアップロード

サインアップ

Google アカウントにログインして下記のページを表示します。

「Create Application」ボタンをクリックします。

携帯認証の画面になるので、携帯のメールアドレスを入力して「確認コードを送信」をクリックします。

携帯に送信された確認コードを入力して「確認」をクリックします。

「Create an Application」というページが表示されるのでアプリケーションの情報を入力します。

アプリの登録

Application Identifier

アプリケーションIDを指定します。APPID.appspot.com のようにアプリケーションのドメイン名として使われます。 一度登録すると変更不可能で、削除すると同じ識別子は二度と使えなくなるので慎重に・・・

Application Title

管理コンソールなどで表示されるアプリケーションのタイトルです。 管理コンソールからいつでも変更できます。

Authentication Options

アプリケーションで認証をする場合の認証方法を選択します。 デフォルトのままで OK です。

デプロイ

まずはアプリケーションの app.yamlapplication の部分を↑で設定したアプリケーションIDの値に書き換えます。

app.yaml

application: ngyuki-helloworld
 :

SDK の appcfg.py でアプリをデプロイします。

google_appengine/appcfg.py update helloworld

途中で Google アカウントのメールアドレスとパスワードが聞かれるので入力します。

http://APPID.appspot.com/ のような URL を開くとアプリの画面が表示されます。

Using the Users Service

Google の Users サービスを使って認証してみます。

helloworld.php

<?php
require_once 'google/appengine/api/users/UserService.php';

use google\appengine\api\users\User;
use google\appengine\api\users\UserService;

$user = UserService::getCurrentUser();

if ($user)
{
    echo 'Hello, ' . htmlspecialchars($user->getNickname());
}
else
{
    header('Location: ' . UserService::createLoginURL($_SERVER['REQUEST_URI']));
}

SDK でアプリをローカルで実行するとダミーの認証フォームが現れます。

アプリを GAE にアップロードすれば、本当の Google アカウントとの統合ができます。

Using Static Files

静的ファイルを使う方法です。まずはアプリの設定ファイルを次のように修正します。

app.yaml

application: ngyuki-helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /css
  static_dir: css

- url: /.*
  script: helloworld.php 

スタイルシートを作成します。

css/style.css

body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}

PHP ファイルを修正します。

helloworld.php

<html>
<head>
    <title>sample</title>
    <link type="text/css" rel="stylesheet" href="/css/style.css" />
</head>
<body>
<?php
echo "Date: " . date('H:i:s');
?>
</body>
</html>

デプロイしてアプリの URL を開くと css が静的なファイルとして参照されてスタイルが適用されます。

google_appengine/appcfg.py update helloworld

phpinfo

phpinfo を表示しようとすると次のようなエラーになります。

Warning: phpinfo() has been disabled for security reasons. It can be re-enabled by adding it to the google_app_engine.enable_functions ini variable in your applications php.ini

Google App Engine では PHP の幾つかの関数は無効にされています。 phpversion や phpinfo は app.yaml と同じディレクトリに php.ini を次の通りに作成すれば有効にできます。

php.ini

google_app_engine.enable_functions = "phpversion, phpinfo"

さいごに

Google Cloud SQL が有料プランしかないので、無料枠だとたいしたこと出来なさそうです。

参考