Deep-dive on the Next Gen Platform. Join the Webinar!

Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
Hide categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • Developer Tools
    • コマンドライン
    • Heroku VS Code Extension
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション
    • 継続的統合
  • 言語サポート
    • Node.js
      • Working with Node.js
      • Troubleshooting Node.js Apps
      • Node.js Behavior in Heroku
    • Ruby
      • Rails のサポート
      • Bundler の使用
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Python でのバックグランドジョブ
      • Python Behavior in Heroku
      • Django の使用
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Maven の使用
      • Spring Boot の使用
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Migrating to Heroku Postgres
    • Heroku Data For Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Working with AI
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
  • 言語サポート
  • PHP
  • Heroku スターターガイド (PHP)

Heroku スターターガイド (PHP)

日本語 — Switch to English

この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。

最終更新日 2024年05月16日(木)

Table of Contents

  • ​はじめに
  • ​設定する
  • ​アプリを準備する
  • ​アプリをデプロイする
  • ​ログを表示する
  • ​Procfile を定義する
  • ​アプリをスケールする
  • ​アプリの依存関係を宣言する
  • ​ローカルの変更をプッシュする
  • ​アドオンをプロビジョニングする
  • ​対話型シェルを起動する
  • ​環境設定を定義する
  • ​データベースをプロビジョニングする
  • 次のステップ

​はじめに

このチュートリアルでは、PHP アプリをデプロイする方法を簡単に紹介します。

少し時間を取って仕組みを学び、Heroku を最大限に活用できるようにしましょう。

このチュートリアルでは、以下が用意されていることを前提としています。

  • 確認済みの Heroku アカウント​
  • ローカルにインストールされた ​PHP​。
  • ローカルにインストールされた ​Composer​。
  • Eco dyno プラン​のサブスクリプション (推奨)

低料金プラン​を使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

​設定する

Heroku CLI には、一般によく使われている Git​ というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。

  • ​Git のインストール
  • ​Git の初期設定

このステップでは、Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、アプリケーションログの表示、アプリケーションのローカル実行に使用します。

ご使用のプラットフォーム用のインストーラをダウンロードし、実行してください。

apple ロゴ​macOS

​$ ​brew tap heroku/brew && brew install heroku

windows ロゴ​Windows

​ご使用の Windows に合ったインストーラをダウンロードします。

​64 ビット用インストーラ

​32 ビット用インストーラ

その他のオペレーティングシステムでのインストール方法については、Heroku CLI の記事​を参照してください。

インストールしたら、コマンドシェルで heroku​ コマンドを使用できます。

heroku login​ コマンドを使って Heroku CLI にログインします。

$ heroku login
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com

このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページに表示されているLog in​ (ログイン) ボタンをクリックします。

この認証は、heroku​ と git​ コマンドが正常に動作するために必要な操作です。

外部の HTTP/HTTPS サービスへの接続にプロキシの使用が必要なファイアウォールを使っている場合は、heroku​ コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY​ または HTTPS_PROXY​ 環境変数を設定​できます。

手順を進める前に、前提条件の項目が正しくインストールされていることを確認します。次の各コマンドを実行し、インストールしたバージョンが表示されることを確認します(実際のバージョンが以下の例と異なる場合があります)。バージョン情報が表示されない場合は、このチュートリアルの最初に戻り、前提条件の項目をインストールしてください。

「アプリの依存関係を宣言する」およびそれ以降の手順を実行するには、ローカル環境で次の設定がすべて完了している必要があります。

このチュートリアルでは、PHP がインストールされている必要があります。PHP がインストールされているかどうかを確認します。

$ php -v
PHP 8.2.3 (cli) (built: Feb 15 2023 00:18:01) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.3, Copyright (c) Zend Technologies

composer​ がインストールされていることを確認します。 インストールされていない場合は、インストール​して、もう一度テストしてください。

$ composer -V
Composer version 2.5.1 2022-12-22 15:33:54

git​ がインストールされていることを確認します。 インストールされていない場合は、インストール​して、もう一度テストしてください。

$ git --version
git version 2.39.1

​アプリを準備する

このステップでは、Heroku にデプロイできるサンプルアプリケーションを準備します。

Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。

ただし、デプロイする既存のアプリケーションを用意してある場合は、 Heroku へのデプロイを準備する方法について、​この記事​を 参照してください。

サンプルアプリケーションをクローンして、Heroku にデプロイするコードのローカルバージョンを作成するには、ローカルのコマンドシェルまたはターミナルで次のコマンドを実行します。

$ git clone https://github.com/heroku/php-getting-started.git
$ cd php-getting-started

これで、シンプルなアプリケーションと、composer.json​ ファイルを格納した、正常な Git リポジトリを準備できました。 Composer​ がインストールされていることを確認してください。Heroku では、PHP プロジェクトの依存関係の管理に Composer を使用しており、アプリケーションが PHP で書かれていることを composer.json​ ファイルで Heroku に示します。

​アプリをデプロイする

このステップでは、アプリを Heroku にデプロイします。

dyno を使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。コストを抑制するために、完了したらすぐにアプリを削除​してください。

 

Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちら​を参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

Heroku でアプリを作成すると、Heroku でソースコードを受け取ることができるよう準備できます。

$ heroku create
Creating app... done, ⬢ sharp-rain-871
https://sharp-rain-871.herokuapp.com/ | https://git.heroku.com/sharp-rain-871.git

アプリを作成すると、heroku​ という名前の Git リモートリポジトリも作成され、ローカルの Git リポジトリと関連付けられます。

Heroku によってランダムなアプリ名 (この場合は sharp-rain-871​) が生成されます。パラメータを渡して独自のアプリ名を指定することもできます。

コードをデプロイします。

$ git push heroku main
…
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Preparing platform package installation...
remote:        NOTICE: No runtime required in composer.json; requirements
remote:        from dependencies in composer.lock will be used for selection
remote: -----> Installing platform packages...
remote:        - php (8.2.3)
remote:        - apache (2.4.55)
remote:        - composer (2.5.3)
remote:        - nginx (1.22.1)
remote: -----> Installing dependencies...
remote:        Composer version 2.5.3 2023-02-10 13:23:52
remote:        Installing dependencies from lock file
remote:        Verifying lock file contents can be installed on current platform.
remote:        Package operations: 22 installs, 0 updates, 0 removals
remote:          - Downloading laravel/serializable-closure (v1.3.0)
remote:          - Downloading psr/log (3.0.0)
remote:          - Downloading monolog/monolog (3.3.1)
…
remote:          - Installing slim/twig-view (3.3.0): Extracting archive
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 16.4M
remote: -----> Launching...
remote:        Released v3
remote:        https://sharp-rain-871.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/sharp-rain-871.git
 * [new branch]      main -> main

アプリ名で生成された URL にあるアプリを開きます。 次のショートカットを使うと、簡単に Web サイトを開くことができます。

$ heroku open

​ログを表示する

Heroku では、すべてのアプリと Heroku コンポーネントの出力ストリームを、時系列のイベントストリームに集約してログを作成するため、1 か所ですべてのイベントを確認できます。

実行中のアプリに関する情報を表示するには、ログコマンド​の 1 つである、heroku logs --tail​ を使います。

$ heroku logs --tail
2023-02-24T13:53:07.000000+00:00 app[api]: Build succeeded
2023-02-24T13:53:07.006183+00:00 app[api]: Scaled to web@1:Eco by user me@example.com
2023-02-24T13:53:08.219766+00:00 heroku[web.1]: Starting process with command `heroku-php-apache2 web/`
…
2023-02-24T13:53:12.981285+00:00 heroku[web.1]: State changed from starting to up

ブラウザでアプリケーションを数回再表示すると、アプリの Web サーバー (Apache HTTPD) および Heroku のルーターだけではなく、アプリ自体によって生成されたログメッセージが表示されます。

2023-02-24T13:59:47.313998+00:00 app[web.1]: [2023-02-24T13:59:47.313572+00:00] default.DEBUG: logging output. [] []
2023-02-24T13:59:47.316389+00:00 app[web.1]: 10.1.46.63 - - [24/Feb/2023:13:59:47 +0000] "GET / HTTP/1.1" 200 6802 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15
2023-02-24T13:59:47.316226+00:00 heroku[router]: at=info method=GET path="/" host=warm-depths-57683.herokuapp.com request_id=95c5fbfd-5aed-4d06-a7e0-ad64d820c9e3 fwd="85.222.134.4" dyno=web.1 connect=0ms service=6ms status=200 bytes=6974 protocol=https

つまり、アプリから何らかのログを出力するということは、出力先が stdout​ または stderr​ になるということです。Heroku では、すべてのアプリやシステムコンポーネントのログの集約処理が行われます。 web/index.php​ファイルを表示して、出力を stderr​ に書き込むために Monolog​ サービスがどのように設定されているかを確認してください。これは「logging output.」メッセージがログに記録される、a few lines later​ を使用するように配置されます。

ログのストリーム出力を停止するには、Control+C​ を押します。

​Procfile を定義する

Procfile​ は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。

先ほどデプロイしたサンプルアプリの Procfile​ は、次のようになっています。

web: heroku-php-apache2 web/

単一のプロセスタイプの web​ と、その実行に必要なコマンドを宣言しています。 ここでは、web:​ という名前が重要です。 これは、このプロセスタイプを Heroku の HTTP ルーティング​スタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しています。

Procfile には追加のプロセスタイプを含めることができます。 たとえば、アイテムをジョブキューから外す処理を実行するバックグラウンドワーカープロセス​を追加で宣言できます。

​アプリをスケールする

現在、アプリは単一の Web dyno​ で実行されています。 dyno とは、Procfile​ で指定されているコマンドを実行する軽量のコンテナのようなものです。

実行されている dyno の数を確認するには、ps​ コマンドを使います。

$ heroku ps
=== web (Eco): heroku-php-apache2 web/ (1)
web.1: up 2023/02/24 14:53:12 +0100 (~ 21m ago)

デフォルトでは、アプリは Eco dyno でデプロイされます。Eco dyno はアイドル状態 (トラフィックを何も受信しない状態) が 30 分続くとスリープします。 スリープすると、スリープ解除するときの最初のリクエスト時に数秒の遅延が発生します。その後のリクエストは正常に処理されます。 Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間​を消費します。割り当て時間が残っている限り、Eco アプリはすべて稼働し続けます。

dyno がスリープしないようにするには、「dyno タイプ​」の記事で紹介されている Basic または Professional の dyno タイプにアップグレードできます。たとえば、アプリを Professional dyno に移行すると、Heroku に特定の数の dyno の実行を指示するコマンドを実行し、各 dyno で Web プロセスタイプを実行させて、アプリを簡単にスケールすることができます。

Heroku でアプリケーションをスケールするとは、実行する dyno の数を変更することを意味します。 Web dyno の数を 0 にスケールしてみます。

$ heroku ps:scale web=0

ブラウザのタブで更新ボタンを押してアプリにアクセスするか、heroku open​ コマンドを使ってブラウザのタブで開きます。 リクエストに応答できる Web dyno がないので、エラーメッセージが表示されます。

もう一度スケールしてみましょう。

$ heroku ps:scale web=1

​アプリの依存関係を宣言する

Heroku では、アプリのルートディレクトリに composer.json​ ファイルがあると、そのアプリを PHP と認識します。

デプロイしたデモ用アプリには、事前に次のような composer.json​ が用意されています。

{
  "require" : {
    "php-di/php-di": "^7.0",
    "slim/slim": "^4.0",
    "php-di/slim-bridge": "^3.1.0",
    "slim/psr7": "^1.3.0",
    "monolog/monolog": "^3.0",
    "twig/twig": "^3.0",
    "slim/twig-view": "^3.0"
  },
  "require-dev": {
    "heroku/heroku-buildpack-php": "*"
  }
}

composer.json​ ファイルでは、アプリケーションと一緒にインストールする必要がある依存関係を指定します。 アプリをデプロイすると、Heroku はこのファイルを読み出し、適切な依存関係を vendor​ ディレクトリにインストールします。

その後、簡単な require コマンドを実行すると、インストールされた依存関係を PHP アプリで使用できるようになります。

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

次のコマンドをローカルコンピュータで実行して依存関係をインストールし、アプリをローカルで使用できるようにシステムを準備します。

$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 23 installs, 0 updates, 0 removals
  - Installing heroku/heroku-buildpack-php (v231): Extracting archive
  - Installing laravel/serializable-closure (v1.3.0): Extracting archive
  - Installing psr/log (3.0.0): Extracting archive
  - Installing monolog/monolog (3.3.1): Extracting archive
…

常に composer.json​ と composer.lock​ を Git リポジトリにチェックインする必要があります。vendor​ディレクトリに .gitignore​ ファイルが格納されている必要があります。

​ローカルの変更をプッシュする

このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させる方法を学びます。 例として、アプリケーションを変更して依存関係 (Cowsay​ ライブラリ) を追加し、それを使用するコードも追加します。

まず、Composer を使用して、新しい依存関係を要求します。

$ composer require alrik11es/cowsayphp

このコマンドにより、composer.json​ も変更されます。 自分で composer.json​ ファイルを変更して依存関係を追加した場合は、必ず次のコマンドを実行して依存関係をアップデートしてください。

$ composer update

次に、このライブラリを使用するように web/index.php​ を変更します。 アプリでは、依存関係の注入のために PHP-DI​ を使用しているため、まずファイルの先頭の近くでコンテナに別のエントリを追加し、PHP-DI に Cowsay の動物インスタンスをインスタンス化する方法を認識させる必要があります。

// Add Cowsay to Container
$container->set(\Cowsayphp\AnimalInterface::class, function() {
  return \Cowsayphp\Farm::create(\Cowsayphp\Farm\Cow::class);
});

これで、web/index.php​ の末尾の近くに新しいルートを追加でき、その関数の AnimalInterface​ 型のヒントによって、PHP-DI では Cow​ クラスのインスタンスが自動的に挿入されます。

$app->get('/coolbeans', function(Request $request, Response $response, LoggerInterface $logger, \Cowsayphp\AnimalInterface $animal) {
  $logger->debug('letting the Cowsay library write something cool.');
  $response->getBody()->write("<pre>".$animal->say("Cool beans")."</pre>");
  return $response;
});

そのルートにアクセスすると、「Cool beans」というメッセージを出す ASCII アートの美しい牛が描画されます。

上記の変更の方法がわからなくなった場合は、サンプルアプリの article-step-push-local-changes​ ブランチ​を参照し、その内容を main​ の内容と比較してください。

次にデプロイします。 Heroku へのデプロイは、ほとんどの場合、このパターンで行います。

まず、変更したファイルをローカルの Git リポジトリに追加します。

$ git add composer.json composer.lock web/index.php

次に、変更内容をリポジトリにコミットします。

$ git commit -m "cowsay for /coolbeans"

前と同じ方法でデプロイします。

$ git push heroku main

最後に、ブラウザで /coolbeans​ ルートをすぐに開いて、すべて正常に動作しているかどうかを確認します。

$ heroku open coolbeans

​アドオンをプロビジョニングする

アドオンは、アプリケーションですぐに使える追加サービスを提供するサードパーティのクラウドサービスです。永続性、ログ記録、モニタリングなど、さまざまなアドオンがあります。

Heroku では、デフォルトで 1500 行のアプリケーションログが記録されます。 完全なログストリームもサービスとして提供しています。複数のアドオンプロバイダーがこのサービスを利用し、ログの永続化、検索、メールや SMS 通知などの機能を実現するログサービスを提供しています。

このステップでは、このようなログに関するアドオンの 1 つである、Papertrail をプロビジョニングします。

Papertrail​ のアドオンをプロビジョニングします。

$ heroku addons:create papertrail
Creating papertrail on ⬢ sharp-rain-871... free
…
Created papertrail-reticulated-81649 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation

アドオンがデプロイされ、アプリケーション用に設定されました。 アプリのアドオンは、次のコマンドで一覧表示できます。

$ heroku addons

このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスする度にログメッセージが生成され、Papertrail のアドオンに送られるようになります。 Papertrail のコンソールにアクセスし、ログメッセージを確認します。

$ heroku addons:open papertrail

ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。 このインターフェースでは、検索したり通知を設定したりできます。

コンソールのスクリーンショット

​対話型シェルを起動する

One-off dyno​ で、heroku run​ コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。 このコマンドを使うと、ローカルのターミナルにアタッチされた対話型の PHP シェルを起動することもできます。これは、アプリの環境で試行錯誤するのに便利です。

$ heroku run "php -a"
Running php -a on ⬢ sharp-rain-871... up, run.8336 (Eco)
Interactive shell

php >

Error connecting to process​ というエラーが表示された場合は、ファイアウォールの設定​が必要な可能性があります。

PHP コンソールには、PHP の標準ライブラリ以外には何もロードされていません。echo​などの PHP 式を入力し、最後に quit​ と入力して PHP シェルを終了します。

$ heroku run "php -a"
Running php -a on ⬢ sharp-rain-871... up, run.8336 (Eco)
Interactive shell

php > echo PHP_VERSION;
8.2.3
php > quit

dyno の仕組みに慣れるため、別の One-off dyno を作成し、この dyno でシェルを開く bash​ コマンドを実行してみましょう。シェルが開いたら、そこでコマンドを実行できます。dyno にはそれぞれ固有の一時的なファイル領域が割り当てられ、アプリとその依存関係がそこに格納されます。コマンド (この場合は bash​) が完了すると、dyno は削除されます。

$ heroku run bash
Running bash on ⬢ sharp-rain-871... up, run.5134 (Eco)
~ $ ls
Procfile  README.md  app.json  composer.json  composer.lock  vendor  views  web
~ $ exit
exit

必ず exit​ と入力してシェルを閉じ、dyno を終了してください。

​環境設定を定義する

Heroku では、設定を外部に置き、暗号鍵や外部リソースのアドレスなどのデータを環境設定​に保存できます。

環境設定は、ランタイムに環境変数としてアプリケーションに提供され、PHP の getenv​ 関数を使用して読み取ることができます。この方法により、アプリソースには、データベースや外部 API エンドポイントなどのハードコーディングされた資格情報が含まれません。

データベース接続情報などの資格情報を格納することに加えて、アプリの重要な動作を制御する設定フラグや設定値を環境設定に配置することも一般的な習慣です。 環境設定を更新すると、新しいリリース​が作成され、新しいコードデプロイを必要とせずにアプリの動作が変更されます。

Cowsay ライブラリでは他の種類の動物がサポートされ​、この例では環境変数を使用して、使用するクラスを制御します。

web/index.php​ を変更して、返される Cowsay 動物クラスインスタンスを決定するための環境変数が DI コンテナクラスで使用されるようにします。

// Add Cowsay to Container
$container->set(\Cowsayphp\AnimalInterface::class, function() {
  $class = '\\Cowsayphp\\Farm\\'.(getenv("COWSAY_FARM_CLASS")?:'Cow');
  return \Cowsayphp\Farm::create($class);
});

これで、COWSAY_FARM_CLASS​ 環境設定により、インスタンス化するクラスが制御されるようになります。そのような環境設定が存在しない場合、以前のようにデフォルトで Cow​ になります。

上記の変更の方法がわからなくなった場合は、サンプルアプリの article-step-define-config-vars​ ブランチ​を参照し、その内容を前の手順と比較​してください。

まずこの変更をコミットしてデプロイします。

$ git add web/index.php
$ git commit -m "make Cowsay animal controllable by env var COWSAY_FARM_CLASS"
$ git push heroku main

/coolbeans​ URL に再びアクセスすると、依然として牛がメッセージを出しているため、COWSAY_FARM_CLASS​ 環境設定を “Cow​” 以外の値に設定して動物の種類を変更してみましょう。

Heroku で環境設定を設定するには、次のコマンドを実行します (“Dragon​” の代わりに “Tux​” や “Whale​” を使用してもかまいません)。

$ heroku config:set COWSAY_FARM_CLASS=Dragon
Setting COWSAY_FARM_CLASS and restarting ⬢ sharp-rain-871... done, v6
COWSAY_FARM_CLASS: Dragon

この環境設定の変更によって新しいリリースが作成され、やはり heroku logs​ で確認できます。

$ heroku logs
…
2023-02-24T15:13:50.993624+00:00 app[api]: Set COWSAY_FARM_CLASS config vars by user me@example.com
2023-02-24T15:13:50.993624+00:00 app[api]: Release v6 created by user me@example.com
2023-02-24T15:13:51.274075+00:00 heroku[web.1]: Restarting
2023-02-24T15:13:51.290040+00:00 heroku[web.1]: State changed from up to starting
2023-02-24T15:13:52.800435+00:00 heroku[web.1]: Stopping all processes with SIGTERM
…
2023-02-24T15:13:53.295318+00:00 heroku[web.1]: Starting process with command `heroku-php-apache2 web/`
…
2023-02-24T15:13:55.179619+00:00 heroku[web.1]: State changed from starting to up

ブラウザで /coolbeans​ を更新すると、別の ASCII アートの動物を使用して「Cool beans」のメッセージが表示されます。

アプリに設定されている環境設定は、heroku config​ を使用していつでも一覧表示できます。

$ heroku config
=== sharp-rain-871 Config Vars
COWSAY_FARM_CLASS:    Dragon
PAPERTRAIL_API_TOKEN: lq7…

​データベースをプロビジョニングする

データベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。コストを抑制するために、完了したらすぐにデータベースを削除してください。低料金プラン​について確認してください。資格のある学生の皆様は、Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

add-on marketplace​ には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。 このステップでは、Heroku Postgres Essential-0 データベースをアプリに追加します。

データベースを追加します。

$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ sharp-rain-871... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-concentric-05005 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-concentric-05005 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation

これによってデータベースが作成され、接続情報を含む URL を格納する DATABASE_URL​ 環境設定が設定されます (この値は heroku config​ を実行して表示できます)。

データベースを使用するには、まず web/index.php​ を変更して、PHP-DI に PHP PDO​ 接続を構築するように指示します。

// Add Database connection to Container
$container->set(PDO::class, function() {
  $dburl = parse_url(getenv('DATABASE_URL') ?: throw new Exception('no DATABASE_URL'));
  return new PDO(sprintf(
    "pgsql:host=%s;port=%s;dbname=%s;user=%s;password=%s",
    $dburl['host'],
    $dburl['port'],
    ltrim($dburl['path'], '/'), // URL path is the DB name, must remove leading slash
    $dburl['user'],
    $dburl['pass'],
  ));
});

このコードで、getenv()​ を使用して環境から DATABASE_URL​ 環境設定を取得し、parse_url()​ を使用してその環境設定からホスト名、データベース、資格情報の情報を抽出する方法に注目してください。

同じファイルに、データベースのクエリを実行するコードで URL /db​ の新しいルートハンドラを追加します。

$app->get('/db', function(Request $request, Response $response, LoggerInterface $logger, Twig $twig, PDO $pdo) {
  $st = $pdo->prepare('SELECT name FROM test_table');
  $st->execute();
  $names = array();
  while($row = $st->fetch(PDO::FETCH_ASSOC)) {
    $logger->debug('Row ' . $row['name']);
    $names[] = $row;
  }
  return $twig->render($response, 'database.twig', [
    'names' => $names,
  ]);
});

このように編集することで、/db​ ルートでアプリにアクセスしたときに、テーブル test_table​ のすべての行が返され (各行はデバッグ目的で heroku logs​ にロギングされる)、database.twig​ という名前の Twig テンプレートを使用して結果が描画されるようになります。

アプリの views/​ ディレクトリ内にこの database.twig​ テンプレートファイルを作成します。

{% extends "layout.html" %}

{% block content %}
<p>Got these rows from the database:</p>

<ul>
{% for n in names %}
  <li> {{ n.name }} </li>
{% else %}
  <li><em>No entries yet!</em></li>
{% endfor %}
</ul>

{% endblock %}

上記の変更の方法がわからなくなった場合は、サンプルアプリの article-step-provision-a-database​ ブランチ​を参照し、その内容を前の手順と比較​してください。

アプリの変更を Heroku にデプロイします。

$ git add web/index.php views/database.twig
$ git commit -m "added database access"
$ git push heroku main

ここで、ブラウザで /db​ を指定すると (または、heroku open db​ を使用してその URL にアクセスすると)、test_table​ が存在しないというエラーが表示されます。

ローカル環境に Postgres がインストールされている​という前提で、前回プロビジョニングしたデータベースに heroku pg:psql​ コマンドで接続し、CREATE TABLE​ SQL コマンドでそのテーブルを作成します。

$ heroku pg:psql
--> Connecting to postgresql-concentric-05005
psql (14.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

=> CREATE TABLE test_table (id INTEGER, name TEXT);
CREATE TABLE

ここで、アプリの /db​ ルートにアクセスすると、テーブルにはまだレコードがないため、「No entries yet!​」(エントリなし) と表示されます。

開いている heroku pg:psql​ セッションに戻り、いくつかの行を挿入します。

=> INSERT INTO test_table VALUES (1, 'hello database');
INSERT 0 1
=> INSERT INTO test_table VALUES (2, 'oh nice, this works!');
INSERT 0 1
=> QUIT

ブラウザで /db​ ページを更新すると、これらのレコードが表示されます。

詳細は、「Heroku PostgreSQL​」を参照してください。

 

MongoDB や Redis のアドオン​をインストールするときも、同様のテクニックを利用できます。

次のステップ

ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。

次にお勧めするリソースを紹介します。

  • 「Heroku の仕組み​」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
  • 「Heroku で PHP アプリをデプロイする​」では、既存の PHP アプリを Heroku にデプロイする方法を紹介しています。
  • PHP カテゴリ​では、PHP アプリケーションの開発とデプロイに関する詳細を確認できます。

関連カテゴリー

  • PHP

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices