GoogleAppEngineでCakePHP2.xを動かす


_注: この記事は'14年6月に作成したものです。_

AppEngineでCakePHPを動かすためのメモ。

App.YAMLとか、ログの保存先とかの修正（設定）が必須。

---

### 用意しておくもの

+ GoogleAppEngineの`Project ID`
    > 例: spring-line-534

+ Google Cloud Strage を用いるならば、`bucket` の名前

+ Cloud SQL に接続するならば、"承認済みの App Engine アプリケーション"に、接続するAppEngineのプロジェクトIDを登録

---

### 参考サイト一覧

> [app.yamlなど基本的な設定](http://aymanrb.blogspot.jp/2013/05/cakephp-deployment-on-google-app-engine.html)
>
> [AppEngine上でのCakePHPの運用](http://blog.vier.jp/2013/07/39google-app-engine-for-phpcakephp.html)
>

---
### app.yaml の修正

app.yaml など、諸々の初期ファイルは、`GoogleAppEngineLauncher`から生成しておきます。便利。


```yaml:app.yaml
application:  Google App Engineのプロジェクト ID
version: 1
runtime: php
api_version: 1
    
handlers:
- url: /css
  static_dir: app/webroot/css

- url: /js
  static_dir: app/webroot/img
    
- url: /img
  static_dir: app/webroot/img
    
# Debug Kitを用いるならば >>>
- url: /debug_kit/css
  static_dir: app/Plugin/DebugKit/webroot/css
    
- url: /debug_kit/js
  static_dir: app/Plugin/DebugKit/webroot/js
    
- url: /debug_kit/img
  static_dir: app/Plugin/DebugKit/webroot/img
    
# <<<    
    
- url: /.*
  script: app/webroot/index.php
```

[DebugKitの導入についてはこちら](http://qiita.com/BUN/items/403cccad9eaa831e6fd8) で、綺麗にまとめられています。

---
### PHP.iniの設定

`php.ini` ファイルを `app.yaml` と同階層に配置し編集。

設定／編集できる項目は [Googleのリファレンス](https://developers.google.com/appengine/docs/php/config/php_ini) に記述されています。


```ini:php.ini
google_app_engine.enable_functions = "php_sapi_name, php_uname, gc_enabled, getmypid, getmyuid, getmygid"
google_app_engine.allow_include_gs_buckets = Cloud Strage を用いるならば、作成して使用する `buckets` の名前を指定
    
date.timezone = Asia/Tokyo #=> `strtotime`とかで必須
    
post_max_size = 32M
upload_max_filesize = 32M
#=> CloudStrage などにFileをアップロードしたりするのに必須
```


---

### Config/core.php ファイルの編集

[こちら](http://blog.vier.jp/2013/07/39google-app-engine-for-phpcakephp.html)の記事を参考に、
`$_SERVER` 変数で、`debug` 値を設定します。

ついでに、Cacheエンジンを、
ローカルの開発環境ならFileキャッシュ、
本番環境ならばApcを使うように設定。

ローカルでもApc導入しているのならば、
`$engine = "Apc";`のままで。



```php:Config/core.php
$engine;
if(isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false){
	// Production
	Configure::write('debug', 0);
	$engine = 'Apc';

}else{
	// Develop
	Configure::write('debug', 2);
	$engine = 'File';

}
```

---
### Config/database.php の設定

ローカル環境で開発する際は、ローカルのMySQLへ、
本番環境はGoogle Cloud Sqlに接続します。


```php:Config/database.php
class DATABASE_CONFIG {
	// デフォルトの設定を空に。
	public $default = null;
	
	// CloudSQL（本番環境）の設定
	public $cloud_sql = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'unix_socket' => '/cloudsql/ CloudSQLで確認できるインスタンスID',
		'login' => USERNAME,
		'password' => PASSWORD,
		'database' => DATABASE,
		'encoding' => 'utf8',
	);

	// 開発環境（ローカル）の設定
	public $localhost = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => USERNAME,
		'password' => PASSWORD,
		'database' => DATABASE_NAME,
		'encoding' => 'utf8',
	);
	
	// Configure::read("debug")で`debug`値を読みに行き、
	// 0 だったら本番環境(CloudSQL)
	// それ以外は開発環境（ローカルホスト）を割り当てる
	public function __construct(){
		if(Configure::read("debug")==0){
			// Production
			$this->default = $this->cloud_sql;
		} else {
			// Dev
			$this->default = $this->localhost;
		}
	}
}
```

---

### Config/bootstrap.php の更新

database.php と同じく、
`debug`値からApcとFileを選択。

```php:Config/bootstrap.php
if(Configure::read("debug")==0){
	//production
	Cache::config('default', array('engine' => 'Apc'));
} else {
	// dev
	Cache::config('default', array('engine' => 'File'));
}
```

あと、ここでログのとりかたも、修正しときます。


開発環境は`File`、本番環境（AppEngine）は`SyslogLog`になるように。

```php:Config/bootstrap.php
if(Configure::read("debug")==0){
	$engine = "SyslogLog";
} else {
	$engine = "File";
}
	
CakeLog::config('debug', array(
	'engine' => $engine,
	'types' => array('notice', 'info', 'debug'),
	'file' => 'debug',
));
CakeLog::config('error', array(
	'engine' => $engine,
	'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
	'file' => 'error',
));
```
---

### app/webroot/index.php の修正

先に上げた[こちらのサイト](http://blog.vier.jp/2013/07/39google-app-engine-for-phpcakephp.html)にもあるように、

`app/webroot/index.php`

にて２行を追加します。

```php:app/webroot/index.php
$_SERVER['SCRIPT_FILENAME'] = __FILE__;
$_SERVER['PHP_SELF'] = 'webroot/index.php';
```

---

### Deploy を行う

`GoogleAppEngineLauncher`からDeployボタンを押して、deployします。

１クリックでデプロイできるので、便利。

しかし、このままでは404エラーが起こる。

- Config/routes.php

- PagesController.php

- View/Pages/home.ctp

上記３点のファイルを修正しなければならない。


---

### 開発を行う

とりあえず404を避けるために、３点のファイルを修正する。

修正せずに新しいControllerを作って、そちらにルーティングさせるかは気分次第。


#### Config/routes.php を修正
```php:Config/routes.php
Router::connect('/', array('controller' => 'pages', 'action' => 'home'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
```
とりあえず、 ルートをPagesControllerのhomeアクションにする。

#### PagesControllerの修正
```php:PagesController.php
public function home(){

}
```
動けば良いので、中身は空のfunctionを作成。


#### home.ctp の修正
```ctp:home.ctp
<h2>TEST</h2>
<p>Hello World</p>
```
最初はいろいろと書かれていますが、
全部さくっと消して、テスト用の文面を記述。

---

これで動作が確認できる。