PHP 5.6 の Web アプリを Heroku で動かす。


Mac OS X を使って開発する。

```
$ sw_vers -productVersion 
10.10.2
```

[Getting Started with PHP on Heroku](https://devcenter.heroku.com/articles/getting-started-with-php#introduction) だと [heroku/php-getting-started](https://github.com/heroku/php-getting-started) を clone して細かい手順が分からなかったので、最初から作ってみる。


## 事前準備

[Heroku | Sign up](https://signup.heroku.com/dc)から、Heroku の無料アカウントを作る。

Homebrew の [homebrew-php](https://github.com/Homebrew/homebrew-php) を使って PHP5.6 と Composer をインストールする。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
$ brew install php56
$ brew install composer
```

[Heroku toolbelt for Mac OS X](https://toolbelt.heroku.com/download/osx)から SDK (.pkgファイル) をインストールする。

SDK をインストール後、ターミナルから Heroku にログインする。

```
$ heroku login
```

## Web アプリを作る
以下のファイルを作る。順を追って説明する。

```
hello
├── Procfile
├── composer.json
└── web
    ├── .htaccess
    └── index.php
```

### ローカルで動かす

web/index.php を作り、ローカルで動かしてみる。

```
$ mkdir hello
$ cd hello
$ mkdir web
$ vi web/index.php
```

```web/index.php
<?php
echo "Hello, World\n";
```

ビルトインウェブサーバーを起動して、http://localhost:8000/web/index.php にアクセスする。

```
$ php -S localhost:8000 &
[1] 23428
PHP 5.6.5 Development Server started at Sun Feb 22 11:14:33 2015
Listening on http://localhost:8000
Document root is /Users/takatama/heroku/ranking
Press Ctrl-C to quit.

$ curl localhost:8000/web/index.php
::1:55514 [200]: /web/index.php
Hello, World
```

### Heroku で動かす

#### (1) Git を初期化する。

Composer を使って SDK をインストールするが、Composer によるパッケージがインストールされる vendor/ は Git では管理しない (.gitignore で指定する)。


```
$ pwd
hello
$ git init
Initialized empty Git repository in hello/.git/
$ echo "vendor/" > .gitignore
```

#### (2) Composer で SDK をインストールする

Composer を使って Heroku の SDK をインストールするのに、composer.json を作る。インストールしたパッケージを呼び出せるよう、web/index.php を修正する。

PHP のバージョンは composer.json で指定する。詳しくは [Heroku PHP Support](https://devcenter.heroku.com/articles/php-support#php-runtimes) を参照のこと。

```
$ vi composer.json
```

```composer.json
{
  "require": {
    "php": "~5.6.0"
  },
  "require-dev": {
    "heroku/heroku-buildpack-php": "*"
  }
}
```

```
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing heroku/heroku-buildpack-php (v64)
    Downloading: 100%         

Writing lock file
Generating autoload files
```

composer install で vendor ファイルができるので、先に作った index.php が vendor/autoload.php を参照するように修正する。

```
$ vi web/index.php
```

``` web/index.php
<?php

require('../vendor/autoload.php');

echo "Hello, World\n";
```

#### (3) 利用する Web アプリケーションサーバの設定

Apache を使う。Procfile を作る。

[Process Types and the Procfile | Heroku Dev Center](https://devcenter.heroku.com/articles/procfile#process-types-as-templates)

```
$ vi Procfile
```

```Procfile
web: vendor/bin/heroku-php-apache2 web/
```

web/.htaccess を作り、Apache の URL ルーティング（mod_rewrite）を設定する。

```
$ vi web/.htaccess
```

```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
```

#### (4) ソースコードを Heroku に push する
Heroku でアプリを動かすため、ソースコードを push する準備をする。

```
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.gitignore
	Procfile
	composer.json
	composer.lock
	web/
	
$ git add .

$ git commit -m 'first commit'
[master (root-commit) 46393c5] first commit
 6 files changed, 76 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Procfile
 create mode 100644 composer.json
 create mode 100644 composer.lock
 create mode 100644 web/.htaccess
 create mode 100644 web/index.php

$ heroku create
Creating hogehoge-fugafuga-9999... done, stack is cedar-14
https://hogehoge-fugafuga-9999.herokuapp.com/ | https://git.heroku.com/hogehoge-fugafuga-9999.git
```

Heroku にソースコードを push する。

```
$ git push heroku master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 1.46 KiB | 0 bytes/s, done.
Total 9 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> No runtime required in composer.json, defaulting to PHP 5.6.6.
remote: -----> Installing system packages...
remote:        - PHP 5.6.6
remote:        - Apache 2.4.10
remote:        - Nginx 1.6.0
remote: -----> Installing PHP extensions...
remote:        - zend-opcache (automatic; bundled)
remote: -----> Installing dependencies...
remote:        Composer version 1.0-dev (833ce984264204e7d6576ab082660105c7d8f04c) 2015-02-17 21:55:44
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:        Nothing to install or update
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing... done, 71.6MB
remote: -----> Launching... done, v3
remote:        https://hogehoge-fugafuga-9999.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/hogehoge-fugafuga-9999.git
 * [new branch]      master -> master
```

#### (5) Web ブラウザーで Web アプリが動作することを確認する

```
$ heroku open
```