Heroku での PHP アプリのデプロイ
最終更新日 2024年05月08日(水)
Table of Contents
この記事では、既存の PHP アプリを Heroku にデプロイする方法について説明します。
Heroku をはじめて使う場合は、『Heroku スターターガイド (PHP)』のチュートリアルから始めた方がよい場合もあります。
前提条件
この記事のベストプラクティスでは、以下があることを想定しています。
- 依存関係管理に Composer を使用する既存の PHP アプリ。
- PHP がインストールされている
- Composer がインストールされている
- 無料の Heroku アカウント
- Heroku CLI
概要
Heroku の PHP サポートについての詳細は、『Heroku PHP サポート』の記事に記載されています。
Heroku の PHP サポートは、アプリケーションがルートディレクトリに composer.json
という名前のファイルを持つ場合にのみアプリケーションに適用されます。アプリケーションに Composer 依存関係が存在しなくても、PHP アプリケーションとして認識されるために空の composer.json
を含める必要があります。
依存関係の管理
Heroku では、PHP プロジェクト内の依存関係管理のために Composer を使用します。アプリに依存関係がある場合、composer.json
ファイルで指定されます。これは次のようになります。
{
"require": {
"monolog/monolog": "^3.0",
}
}
PHP アプリでは、Composer がインストールした依存関係を使用できるようになります。依存関係は通常、Composer によって生成された自動ローダーを含めた後で、一般的に次のようにして vendor/
ディレクトリにインストールされます。
require('vendor/autoload.php');
ベンダーライブラリは Composer によって vendor/
にインストールされますが、一部のプロジェクトではこのディレクトリの名前を再定義します。composer config vendor-dir
を実行して正しいパス名を見つけてください。
composer.json
内の依存関係を追加または変更した場合、ロックファイルを再生成する必要があります。このロックファイルは、依存関係について複数の環境にわたって再現可能な動作を保証する上で重要です。また、これは開発/本番パリティの確認にも役立ちます。composer.lock
ファイルを生成するには、Composer がインストールされていることを確認し、次のように入力します。
$ composer update
依存関係を更新してロックファイルを再生成した後で、変更内容を Git リポジトリに追加およびコミットすることを忘れないようにしてください。
$ git add composer.json composer.lock
$ git commit
アプリがデプロイされるときは常に、Heroku は composer.lock
ファイルを読み取り、ビルド中に composer install --no-dev
を実行することによって、適切な本番の依存関係を vendor
ディレクトリにインストールします。詳細は、「PHP のビルドの動作」を参照してください。
チームのすべての開発者は composer install
を実行して他の人と同じ依存関係をインストールします。これは、composer.lock
がこれらを「記憶している」ためです。
ビルド成果物を Git の外部に保持する方法
.gitignore
ファイルを作成することによって、ビルド成果物がリビジョン管理の対象に入らないようにします。Composer の vendor
ディレクトリが .gitignore
ファイルに含まれている必要があります。これにより、リポジトリのサイズが小さく維持され、依存関係の更新が簡素化され、Composer が composer.lock
に基づいてアプリケーションの依存関係を確実にインストールできるようになります。
標準的な .gitignore
ファイルは次のとおりです。
vendor/
.env
ランタイムおよび拡張の指定
オプションで、ランタイム中に使用するエンジン (PHP または HHVM) およびバージョンを指定することができます。詳細は、「ランタイムの選択」の記事を参照してください。
デフォルトで有効化されていないすべての PHP 拡張は、composer.json
経由で有効化できます。拡張機能の記事には、これらをアクティベートする方法に関する利用可能な拡張機能および指示の詳細なリストがあります。
Procfile
Procfile は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、プロセスタイプを定義し、アプリを起動するために実行するコマンドを明示的に宣言します。Procfile
は次のようになります。
web: heroku-php-apache2
単一のプロセスタイプの web
と、その実行に必要なコマンドを宣言しています。ここでは、web
という名前が重要です。これは、このプロセスタイプを Heroku の HTTP ルーティングスタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しています。
Web サーバーの選択
Procfile
の web
プロセスタイプに使用するコマンドは、アプリケーションを実行するために使用するランタイム (PHP または HHVM) および Web サーバー (Apache2 または Nginx) によって異なります。使用可能なオプションは、「Web サーバー」の記事に記載されています。たとえば、Web サーバーとして代わりに Nginx を使用する場合、Procfile
には次のコマンドが含まれます。
web: heroku-php-nginx
これらのブートスクリプト (heroku-php-apache2
または heroku-php-nginx
) は、アプリケーションの設定を微調整するためのさまざまなオプションおよび引数を受け付けます。詳細は、『PHP のための Web サーバーおよびランタイム設定のカスタマイズ』を参照してください。
ドキュメントルートの設定
オプションとして、アプリのルートディレクトリとは別の、アプリケーションのドキュメントルートを使用することができます。このようにするには、Procfile
を変更してブートスクリプトの末尾に引数を追加します。引数は、ドキュメントルートとして使用するディレクトリの名前で、アプリケーションのルートディレクトリの相対ディレクトリになります。
たとえば、JavaScript、CSS、イメージ、および index.php
ファイルを格納する public
という名前のフォルダがある場合、Procfile
はドキュメントルートとして使用されるそのディレクトリを持つ Apache Web サーバーを、次のように定義します。
web: heroku-php-apache2 public/
Heroku へのアプリケーションのデプロイ
変更内容を Git にコミットしたら、アプリを Heroku にデプロイできます。
$ git add .
$ git commit -m "Added a Procfile."
$ heroku login
Enter your Heroku credentials.
...
$ heroku create
Creating arcane-lowlands-8408... done, stack is cedar
http://arcane-lowlands-8408.herokuapp.com/ | git@heroku.com:arcane-lowlands-8408.git
Git remote heroku added
$ git push heroku master
...
-----> PHP app detected
...
-----> Launching... done
http://arcane-lowlands-8408.herokuapp.com deployed to Heroku
アプリをブラウザで開くには、heroku open
と入力します。
One-off dyno
Heroku では、heroku run
コマンドを使用することによって、コマンドを One-off dyno で実行できます。これは必要なときに限り実行する必要があるスクリプトおよびアプリケーションに使用します。たとえばメンテナンスタスク、データベースへのフィクスチャのロード、アプリケーションの更新中のデータベースの移行などがあります。
たとえば、次のようなコードを実行することによって、Doctrine を使用してアプリケーションのデータベース移行を実行するために、heroku run
を使用することができます。
$ heroku run "php app/console doctrine:migrations:migrate"
Running `php app/console doctrine:migrations:migrate` attached to terminal... up, run.4062
Migrating up to 20100416130452 from 0
>> migrating 20100416130452
-> CREATE TABLE users (username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL) ENGINE = InnoDB
>> migrated
デプロイ後のアプリケーションの状態を調査するなどのデバッグの目的で、heroku run bash
を使用して、完全なシェルを One-off dyno で実行することができます。ただし、この操作により、同時に実行されている可能性があるいずれかの Web dyno に接続されるわけではありません。
$ heroku run bash
Running `bash` attached to terminal... up, run.5662
$ cat Procfile
web: heroku-php-apache2
$ exit
ログ記録
Heroku はログをストリームとして処理し、ログは一時的なファイルシステムではなく STDOUT および STDERR に書き込まれることを期待します。
ログ記録情報を送信する最も基本的な方法は、次のようにコード内で php://stderr
ストリームへの書き込みを指定することです。
file_put_contents("php://stderr", "something happened!");
Heroku のログに関する一般的な情報については、「ログのドキュメント」を参照してください。
次のステップ
- 『Heroku PHP サポート』ドキュメントを読み、使用可能なバージョン、拡張、機能、および動作について学習します。
- PHP 用の Web サーバーおよびランタイム設定をカスタマイズする方法、特にアプリケーションのドキュメントルートを設定する方法について学習します。
- Composer 用のカスタム GitHub OAuth トークンを使用します。
- Dev Center の PHP カテゴリを探索します。