Skip to content

Latest commit

 

History

History
81 lines (57 loc) · 3.63 KB

SAKURAの共有サーバで環境変数を使う.md

File metadata and controls

81 lines (57 loc) · 3.63 KB

#SAKURAの共有サーバで環境変数を使う

Gitに入れられない固有の値は「環境変数」に入れておく、というのがPaaSを使い慣れた人の共通認識だと思います。でも、SAKURAの共有サーバで同じことをやろうとすると、ApacheのsuEXECが有効になっているらしく、上手くいきません。

(結論から言うと、環境変数を取り出すのは色々難があるのですが、既存のコードにちょっと細工して、それっぽく使う方法を紹介します)

##普通のやり方 Apacheの設定経由で、SetEnvを使うのが一般的でしょうか。

SetEnv DB_HOST localhost
SetEnv DB_NAME my_db_name
SetEnv DB_USER db_admin
SetEnv DB_PASS *******

※もちろん、単純にシェルから環境変数を入れておく手もあります。

##でも... 前述の通りSAKURA(の共有サーバ)では...

  • Apacheの設定ができない (※.htaccessではGitリポジトリに含まれてしまう)
  • 設定で来たとしても、suEXECに阻まれる。

suEXEC は、安全な環境変数のリスト (これらは設定時に作成されます) 内の変数として渡される安全な PATH 変数 (設定時に指定されます) を設定することで、 プロセスの環境変数をクリアします。 cf. suEXECサポート

##仕様がないので。 環境変数をエミュレートする方法を考えます。

まず、前提としてディレクトリ構成が次のようになっているとします。(太字は元々SAKURAで用意されているディレクトリ)

  • /home/username/
    • www
      • yourwebsite.com/ : virtual hostのルート
        • index.php
        • evlfs.php
    • env_vars
      • yourwebsite.com : 環境変数がiniファイル形式で納められたテキストファイル

SAKURAのデフォルトでは、**/home/username/www/**がドキュメントルートになっていますが、マルチドメインで使うケースが多い(と思う)ので、上記のようにwwwの下にディレクトリを置いています。

iniファイル形式で値を書く

PHPには、iniファイル形式をパースする便利な関数があります。環境変数にセットしたい内容も、iniで書くことにしましょう。

DB_HOST = localhost
DB_NAME = my_db_name
DB_USER = db_admin
DB_PASS = *******

これを、env_varsディレクトリ内に置きます。他ドメインでも利用する場合は、ファイル名をドメイン名にしてドメイン毎に用意します。

$_SERVERにセット

後は、PHPからiniファイルを読込めばOKです。evlfs.phpファイルの内容は次のような感じに。

<?php
/**
 * Enviroment Variable Loader for SAKURA
 */
$path = "{$_SERVER['DOCUMENT_ROOT']}/../env_vars/{$_SERVER['HTTP_HOST']}";
if ('support@sakura.ad.jp' == $_SERVER['SERVER_ADMIN'] && file_exists($path))
	$_SERVER = array_merge($_SERVER, parse_ini_file($path));
  • SAKURAのサーバ上で実行されているか、
  • iniファイルが存在するか、

をチェックして、iniファイルの内容を$_SERVER配列に追加します。

最後、フロントコントローラ(index.php)から evlfs.php を読込みます。

require_once 'evlfs.php';

これで、$_SERVER['DB_HOST']で'localhost'を取得できるようになりました。PaaS的な書き方をしてしまったコードも、この一行だけで無事動くようになるはず!