PHP
Heroku

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

More than 3 years have passed since last update.

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

$ sw_vers -productVersion 

10.10.2

Getting Started with PHP on Heroku だと heroku/php-getting-started を clone して細かい手順が分からなかったので、最初から作ってみる。


事前準備

Heroku | Sign upから、Heroku の無料アカウントを作る。

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から 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 を参照のこと。

$ 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

$ vi Procfile

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

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

$ vi web/.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