FuelPHPの環境構築と設定のまとめ




# FuelPHPのインストール方法

## FuelPHPのインストール
### Composerによるインストール
2014年10月時点で、最新バージョンの1.7.2からは依存関係がComposerで管理できるようになりました。

```prompt
$ composer create-project fuel/fuel:dev-1.7/master プロジェクト名
```

Composerが無い場合は、Homebrewでインストールしておきましょう。

```prompt
$ brew install composer
```

Composerで管理されるパッケージの一覧は、ダウンロードされたFuelPHPプロジェクト直下のcomposer.jsonに記述してあります。

Composerをアップデートするには、下記コマンドを実行します。

```FuelPHPプロジェクト/
$ php composer.phar self-update
$ php composer.phar update
```

### oilコマンドによるインストール

まず、oilコマンドをインストールします。

```prompt
$ curl get.fuelphp.com/oil | sh
```

プロジェクトのディレクトリを作成し、その中にoilコマンドでFuelPHPをインストールします。

```prompt
$ mkdir プロジェクト名
$ cd プロジェクト名
$ oil create プロジェクト名
```

## composer.jsonの編集
composer.jsonはComposerの設定ファイルです。
FuelPHPの依存ライブラリを一括してインストールできます。

FuelPHPのデフォルトのcomposer.jsonでは、minimum-stability(依存するパッケージの最低限の安定性)がdev(開発版)になっているため、これをstable(安定版)に変更します。

```プロジェクト名/composer.json
"minimum-stability" : "stable",
```

composer.jsonを編集したら、下記コマンドで依存関係をアップデートします。

```プロジェクト名/
$ php composer.phar self-update
$ php composer.phar update
```

特に、本番環境へgitでデプロイする場合は、デフォルトでは依存パッケージはgitで管理されないようになっているため（.gitignoreファイル参照）、本番環境の中で`composer.phar update`するか、.gitignoreファイルを修正して依存パッケージもgitで管理するようにします。


# 環境変数の設定

## config.phpの編集
### 言語設定
PHPにはロケールに影響を受ける関数が多数あるので、日本語を扱う場合は日本語のロケールに設定する必要があります。

```php:プロジェクト名/fuel/app/config/config.php
'language' => 'ja', // Default language
'local' => 'ja_JP.UTF-8', // PHP set_local() setting, null to not set
```

### タイムゾーンの設定
タイムゾーンは日本であれば東京でなくても'Asia/Tokyo'と設定します。

```php:プロジェクト名/fuel/app/config/config.php
'defaul_timezone' => 'Asia/Tokyo',
```

### ロギングの設定
開発時にはログ情報は多い方がいいので、すべてのログを記録するようにします。

```php:プロジェクト名/fuel/app/config/config.php
'log_threshold' => Fuel::L_ALL,
```

### トークンソルトの設定
CSRF対策のトークンを生成するためのソルトを設定します。

```php:プロジェクト名/fuel/app/config/config.php
'token_salt' => 'abcdefghijklmnopqrstuVwxyZ/1234567890',
```

## bootstrap.phpの設定
### 文字コードの設定
FuelPHPはデフォルトではHTTPレスポンスヘッダに文字コードを指定しないので、次のようなヘッダになっています。

```
Content-Type: text/html
```

default_charsetを指定することで、文字コードも出力させるように変更することができます。
下記を`fuel/app/bootstrap.php`に加筆します。

```php:プロジェクト名/fuel/app/bootstrap.php
// Set default charset
ini_set('default_charset', 'UTF-8');
```

これで、レスポンスヘッダが次のようになります。

```
Content-Type: text/html; charset=UTF-8
```

### 本番環境と開発環境を切り替える
#### .htaccessを修正する方法
```プロジェクト名/public/.htaccess
SetEnv FUEL_ENV production
```

本番環境でPHPのエラーをユーザの画面に表示させないために、この設定は必要です。
エラーを表示させない方法については後述します。

ただこの方法だと頻繁に本番環境を修正したい場合、ローカル開発環境ではいちいち.htaccessファイルを修正する必要があり不便です。
なので、完成に至るまでは下記bootstrap.phpを修正する方法で対応すると良いかと思います。

#### bootstrap.phpを修正する方法
PHPのグローバル変数である$_SERVERを利用すると、次のようにうまく書けます。

```php:プロジェクト名/fuel/app/bootstrap.php
switch (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')
{
    case 'example-env.elasticbeanstalk.com':
    case 'example.jp':
        Fuel::$env = Fuel::PRODUCTION;
        break;

    default:
        Fuel::$env = Fuel::DEVELOPMENT;
        break;
}
```

この場合、本番環境ではHTTPS通信にしている場合などに、自動で環境を切り替えてくれるのでとても便利です。

これでconfigフォルダ内のdb.phpを、ローカル環境のときはローカルDBを使用し本番環境では違うDBを参照するなどの設定ができます。


## 設定値の確認
適当なコントローラとビューを作成し、下記を出力して確認することができます。

```php:
echo '<pre>';
echo Fuel::VERSION . PHP_EOL;
echo setlocale(LC_ALL, 0) . PHP_EOL;
echo Date::forge()->format('mysql') . PHP_EOL;
echo ini_get('default_charset');
echo Fuel::$env . PHP_EOL;
echo isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '$_SERVER[\'SERVER_NAME\'] is not set';
echo '</pre>';
```

次のように表示されていれば問題ありません。

```
1.7.2
ja_JP.UTF-8
2014-10-24 16:38:22
UTF-8
development
example.local
```


# 本番環境へのデプロイの際の注意点

## フルコントローラ（public/index.php）の編集
### エラー表示について
デフォルトの設定ではdisplay_errorsが1になっているので、FuelPHPがキャッチできないエラーがあるとPHPのエラーが表示される可能性があります。

これを回避するために下記のようにpublic/index.phpを修正します。

```php:public/index.php
/**
 * Set error reporting and display errors settings.  You will want to change these when in production.
 */
error_reporting(-1);
if (isset($_SERVER['FUEL_ENV']) && $_SERVER['FUEL_ENV'] === 'production')
{
	// FuelPHPでキャッチできないエラーをPHPでもキャッチさせない
	ini_set('display_errors', 0);
}
else
{
	ini_set('display_errors', 1);
}
```

この設定が有効なのは、本番環境であることの指定の仕方を.htaccessで`SetEnv FUEL_ENV production`と記述した場合です。
bootstrap.phpでの設定では$_SERVER['FUEL_ENV']が設定されないので注意しましょう。


### 実行時間とメモリ使用量の表示について
pulic/index.phpの最後の方に、実行時間とメモリ使用量の表示をするコードがあります。
これも本番環境では必要ないので、下記のように条件分岐を行うか、コメントアウトして削除します。

```php:public/index.php
// This will add the execution time and memory usage to the output.
// Comment this out if you don't use it.
if (!isset($_SERVER['FUEL_ENV']) || $_SERVER['FUEL_ENV'] !== 'production')
{
	if (strpos($response->body(), '{exec_time}') !== false or strpos($response->body(), '{mem_usage}') !== false)
	{
		$bm = Profiler::app_total();
		$response->body(
			str_replace(
				array('{exec_time}', '{mem_usage}'),
				array(round($bm[0], 4), round($bm[1] / pow(1024, 2), 3)),
				$response->body()
			)
		);
	}
}
```


## Composerのrequire-devで指定したパッケージについて
require-devで指定したパッケージは開発環境専用のものなので本番環境には不要です。

また、-oオプションを指定して。PSR-0/4に準拠したクラスのオートロードを最適化することができます。
特にAspectMockのような負荷の高いオートローダは削除しておくことが推奨されています。
（開発時には便利ですが）

まとめると、下記コマンドを本番環境のFuelPHPプロジェクト直下で実行すればいいことになります。

```
$ php composer.phar install --no-dev -o
```

本番環境によっては管理者権限でないと実行できない場合があるので、その場合はsudoを先頭につけて実行します。