エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説

      2023/12/28

Apacheに環境変数を設定し定数定義ファイルを本番と開発を振り分ける処理

 

定数定義ファイルを本番環境用と開発環境用とで分ける

 
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
上記の記事で、定数を管理する方法の解説をしました。
 
 
定数なので固定の値なのですが、下記のようなサイトの URLやメールアドレスなどを設定する定数は「開発環境」と「本番環境」とでは違うものを設定したい場合もあるかと思います。
 

 
 
この記事では、これらの定数のファイルを開発環境と本番環境とで自動的に切り替える方法を解説します。
 
ちなみに「CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説」では解説をしていますが、CakePHP3 と CakePHP4とでは定数の設定の仕方が少し変更になっていますので、CakePHP3ユーザの方は改めて確認をしてみてください。
 
 
また、「app_local.php」「.env」に定数を定義する方法については「CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法」を参考にしてください。
 
 

環境変数を Apacheの設定ファイル「httpd.conf」or「.htaccess」に設定

 
まず初めに「環境変数」を設定します。
 
「環境変数」は、基本的には「開発環境」にのみ指定します。(「開発環境」に設定する理由は後程説明します。)
 
 
対象ファイルは下記の「httpd.conf」(or「.htaccess」)です。
 
Apacheの設定ファイル「/etc/httpd/conf/httpd.conf」
(「httpd.conf」のパスは CentOSを想定しています。)
 
もしくは、
ドキュメントルートにある「.htaccess」です。
 
※どちらでも問題ありませんが、「httpd.conf」に設定すればそのサーバを利用する開発共通して反映させることができます。
 「.htaccess」は、プロジェクトごとに設定する必要が発生します。
 
 
「httpd.conf」or「.htaccess」ファイルを開いて、ファイルの一番最後などに書きの記述を追加します。記述する内容はどちらも同じです。
 

 
「CAKE_ENV」が環境変数の変数名で、「develop」がその値になります。
複数設定することもできます。
また、上記の例では「ダブルクォート(")」で囲っていますが、囲わなくても動作します。(囲っておく方が無用なトラブルに遭遇する可能性は減るかと思います。)
 
「httpd.conf」に記述した場合は、Apacheを再起動して環境変数を反映させます。
「.htaccess」に記述した場合は記述するだけで反映されます。
 
 

設定した「環境変数」を取得する方法

 
設定した「環境変数」が正しく設定されたかを確認するため、設定した環境変数を取得してみましょう。
環境変数を取得する方法は下記のように複数存在します。
 

 
ただ、「$_ENV["CAKE_ENV"]」は私の環境ではうまく取得できませんでした。
 
 
また、「phpinfo();」を実行すると、リストの中に環境変数の情報も表示されます。
 
 

定数ファイルを作成

 
続いて、定数ファイルを作成します。
CakePHP4で定数の設定と呼び出し方法の解説(defineとConfigure)」の記事では「/config/const.php」というファイルを作成し、定数を設定しましたが、加えて下記のように「開発用」「本番用」の定数ファイルを作成します。
ファイル名のつけ方の決まりはありませんので、自由に設定してください。
 
開発環境用
/config/const_develop.php
 
本番環境用
/config/const_production.php
 
 
開発環境用の「const_develop.php」には下記を設定します。
 

 
 
本番環境用の「const_production.php」には下記を設定します。
 

 
 

「bootstrap.php」に定数ファイルを取得する分岐処理を記述

 

 
上記の 9行目で環境変数によって「本番用」「開発用」の振り分けを行っています。
 
 

「環境変数」を「開発環境」に設定する理由

 
私は、
環境変数「CAKE_ENV」が「develop」であれば「開発環境」。
そうでなければ、「本番環境」。
という処理をしています。
 
理由は「httpd.conf」ファイルを変更する手続き(業務上の手続きなども含めて)は、本番環境より開発環境の方が楽だと思うためです。
 
 

Shellを実行する場合はコマンド内に環境変数を指定する

 
CakePHP3の Shellでバッチ処理を作成して、コマンドラインから Shellを起動して実行する場合は、下記のようにコマンド内に環境変数を指定します。
 

 
Shellをコマンドから実行する場合は、Apacheを経由せずにプログラムが実行されるため、Apacheの設定ファイル「/etc/httpd/conf/httpd.conf」に記述してある環境変数は読み込まれません。
 
そのため、実行するコマンドの中に環境変数を直接記述しておく必要があるのです。
 
 

CakePHP4で環境ごとに異なる定数を管理するオススメの方法

 
CakePHP4で環境ごとに異なる定数を管理する方法の中では、この記事で紹介した「環境変数」で定数のファイルを切り替える方法をオススメします。
 
 
この記事で紹介した方法は、環境変数を設定し、その値によって読み込む定数定義ファイルを振り分ける、というものでした。
 
その他では、CakePHP4には、環境ごとに異なる定数を「/config/app_local.php」や「.env」にて環境ごとに異なる定数を定義する方法が用意されています。
ですが、「CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法」の記事内でも触れていますが、「app_local.php」や「.env」は、定数を定義するファイルではあるものの、プログラマーがオリジナルで定義する定数を設定するファイルとしては不適切であろうと考えています。
 
「app_local.php」や「.env」は、データベース接続情報やメールサーバへの接続情報などの機密情報を含むため、Gitなどのソースコードのバージョン管理ツールなどでは管理しないファイルとなります。
そのため、「app_local.php」や「.env」にオリジナルの定数を定義する場合、その定数を変更したり、追加したりする場合の管理はアナログ的なものとなります。
 
それによって、リリース時に
『本番環境の「app_local.php」を更新し忘れていた!』
『本番環境に開発用の「app_local.php」をリリースしちゃった!』
と言うようなミスが発生する可能性があるのです。
 
 
対して、この記事で紹介した「環境変数」を使って使用する定数ファイルを切り替える方法であれば、定数のファイルをすべて Gitで管理することができます。
そのため、本番リリース時もソースファイルをまとめてリリースするだけでよく、「app_local.php」「.env」を使うときのようなミスが発生する可能性はなくなるのです。
 
そのため、このリスクを避けることにメリットを見出せるならば、この記事の方法を検討する価値があるのかと考えています。
 
 
「app_local.php」や「.env」で管理する定数と、この記事で紹介した環境変数で振り分ける定数では、定数の持つ意味が異なるために異なる方法を使って管理する方がいいのではないか、と考えています。
 
 
CakePHP4 オフィシャルサイト 構成設定
https://book.cakephp.org/4/ja/development/configuration.html
 
 

CakePHP4の関連記事

CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP 2.3でファイルのアップロード処理を作る

CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。

CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説

CakePHP3でJavaScriptやCSSを編集する基本形から、それらやテンプレート(エレメント)を特定のテンプレートを読み込んだときのみ編集、実行するための方法、ブロック化について解説。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。

CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法

CakePHPの同一テーブルにある項目の値を比較し条件に合致するレコードを取得する方法を解説。[”項目名”=>”値”]ではなく[”項目名 = 項目名”]と書くところがポイント。

CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応

CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!

CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説

CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。