[PHP]コマンドライン時のサーバ設定変数に関して

TIPS
TIPS

Webサーバー(Nginx/Apache)の設定で SITE_TYPE を渡している場合、CLI(コマンドライン)ではその設定が読み込まれないため、環境変数として渡してあげるのが最もスマートな解決策です。

方法は大きく分けて2つあります。

方法1:実行時に環境変数を渡す(一番手軽)

コマンドを実行する際、コマンドの前に変数を書くことで、そのプロセス内だけで有効な変数を渡せます。

# 本番環境として実行したい場合
SITE_TYPE=production php cli.php /table/create

# 開発環境として実行したい場合
SITE_TYPE=development php cli.php /table/create

cronなどで実行する場合も、このように書けばOKです。

方法2:PHP側の判定ロジックを修正する(推奨)

PHPコード側で、Webサーバーからの変数($_SERVER)と、OSの環境変数(getenv)の両方を見るように修正すると、WebでもCLIでも同じロジックで動くようになります。

今の if 文の判定箇所を、以下のように書き換えてみてください。

// 1. 環境変数を取得 (CLI用)
$env_type = getenv(\'SITE_TYPE\');

// 2. Webサーバー変数を取得 (Web用)
$server_type = $_SERVER[\'SITE_TYPE\'] ?? null;

// 3. どちらか設定されている方を採用 (環境変数優先)
$site_type = $env_type ?: $server_type;

// 判定ロジック
if ($site_type === \'production\') {
    // 本番サーバーの設定
    DEFINE(\'PYTHON_CMD\', \'/usr/bin/python3\');
    // ... 他の設定

} elseif ($site_type === \'staging\') {
    // ステージングの設定
    // ...

} else {
    // ここに質問にあったコードが入ります
    DEFINE(\'PYTHON_CMD\', \'/var/www/html/venv/bin/python3\');
}

永続的に環境変数を設定したい場合

毎回 SITE_TYPE=... と打つのが面倒な場合(例えば開発機など)は、ユーザーのプロファイルに書き込んでしまいます。

Bash

# .bashrc または .profile に追記
echo \'export SITE_TYPE=development\' >> ~/.bashrc
source ~/.bashrc

これで、次回から単に php cli.php ... と打つだけで、自動的に $env_type で development が取得できるようになります。

Q よくある質問 (FAQ)
Q. なぜWebサーバーで設定した環境変数がCLI実行時に読み込まれないのですか?
A.
Webサーバー(NginxやApache)の設定で定義された環境変数は、そのWebサーバープロセス内でのみ有効であり、OSのシェルから直接実行されるCLIプロセスには引き継がれないためです。
Q. CLIとWebの両環境で同じ環境変数をスマートに参照するにはどうすればよいですか?
A.
PHPコード側で `$_SERVER['SITE_TYPE']` だけでなく、`getenv('SITE_TYPE')` も併せて確認するロジックに修正することで、どちらの実行環境でも共通して変数を取得できるようになります。

コメント

タイトルとURLをコピーしました