2009-11-27 14 views
24

アプリケーションの設定を保存する最良の方法を決定しようとしています。非常に多くのオプションがあります。PHP - アプリケーション設定ファイルは - ini、php、sql、キャッシュ、PHPクラス、JSON、php配列として保存されていますか?

私が見たアプリケーションの大部分は、単純なrequireと変数を含むPHPファイルを使用しています。そこにははるかに高度な技術があるようです。

何を使用しましたか? 何が最も効率的ですか? 最も安全なものは何ですか?

答えて

8

あなたができることは、the simplest thing that could possibly work(PHP変数)であり、クラスにまとめてください。そうすれば、後でクライアントコードを変更することなく実装を変更することができます。構成クラスが実装するインターフェイスを作成し、クライアントコードでインターフェイスメソッドを使用するようにします。後でデータベースやJSONなどに設定を保存することにした場合は、既存の実装を新しいものに置き換えることができます。構成クラスがテスト可能であることを確認し、単体テストを作成します。

0

PHP自体でコア構成を行うのが最善ですが、データベースを使用していて余分なオーバーヘッドを気にしない場合は、データベースにいくつかの設定を柔軟に追加することができますあなたがそれを適切に整理していると仮定します)。

いずれにしても、このデータをJSON、INI、XLなどに格納することは、今日はWeb上であまりにも多く行われている別の不要な抽象化です。データベースにいくつかの設定の柔軟性が欲しい場合を除いて、あなたの最善の策は純粋なPHPです。

5

Zend_Configが良い解決策であるとわかります。 configuration from a simple arrayは、an INI style fileまたはan XML documentからロードできます。どのオブジェクトを選択しても、構成オブジェクトは同じなので、ストレージ形式を自由に切り替えることができます。 Zend_Configのオブジェクトもマージすることができます。これはアプリケーションに応じて便利です(サーバー設定、サイト/インストール設定ごと)。

Zend Frameworkのほとんどの(またはすべての)ものと同様に、簡単にZend_Configを単独で使用できます。

効率を考えると、文字列の解析が少なくて済むため、最速の方法は配列を使用することです。しかし、INI/XML形式は、一部の人にとっては維持しやすくなります。もちろん、いくつかのキャッシングは、あなたに両方の世界の最高を与えるでしょう。

また、Zend_ConfigのINIファイルを使用すると、お互いを継承する設定のセクションを定義することができます。最も一般的な使い方は、 'production'セクションから継承した '開発'セクションで、次にDB /デバッグ設定を再定義します。

セキュリティについては、設定ファイルをウェブルートから外しておくことは、最初の手順です。読み取り専用にしてアクセスを制限すると、がさらに有効になります。セキュリティが保護されています。しかし、あなたのホスティング/サーバの設定によっては、そこでできることが限られているかもしれません。

13

Local.phpというファイルをSCMシステムから除外して使用します。いくつかの定数やグローバル変数が含まれています。たとえば:

// Local.php 
class Setting 
{ 
    const URL = 'http://www.foo.com'; 
    const DB_User = 'websmith'; 
} 

そして、それがするだけでどこでもを参照することができます:あなたは、実行時に書き込み可能に設定する必要がある場合

Setting::URL 

、私はあなたの代わりに公共の静的変数を使用することをお勧め。

+0

私は設定のためにオートローディングを使うことができるので、$ _SERVER ['REMOTE_ADDR']のようにクラスのconstを別の変数から設定することをお勧めします。 – JasonDavis

+0

Apache設定で 'SetEnv'を使うと、 '$ _SERVER'に現れる環境変数です。 – gahooa

8

は、ここに記載された技術を使用してPHP-アレイの設定ファイルを使用してみてください:http://www.dasprids.de/blog/2009/05/08/writing-powerful-and-easy-config-files-with-php-arrays

この方法は、あなたがこのような方法でアプリの設定を記述することができます: app.config.php

<?php 

return array(
    'appname' => 'My Application Name', 
    'database' => array(
    'type' => 'mysql', 
    'host' => 'localhost', 
    'user' => 'root', 
    'pass' => 'none', 
    'db' => 'mydb', 
), 
); 

は、この方法では、オペコード・キャッシャ(APC、XCACHE)によってセキュアでキャッシュ可能です。

0

php varsを使用しないと思う唯一の理由は、スイッチ間でデータ/動作の整合性が保たれるように、制御された方法で構成を切り替える必要があるということです。たとえば、データベースを切り替えている場合、スイッチオーバーが発生するまで(ゴースト書き込みを防止するためにシステムがロックされますが、ダーティリードは可能です)。

このようなことが懸念される場合は、システムを一時的にロックしてロックを解除する前にすべての変更を読み込んでデプロイする特別な管理ページをアプリケーションに書くことができます(セキュリティのみのローカルアクセス)。

整合性が問題となるトラフィックの多いサイトを実行している場合は、これを検討する必要があります。交通量の少ない時間外に展開できる場合は、php varsやその他の標準的なテキスト形式でも問題ありません。

2

中央のXML/Xpath構成を実装する方法の一例です。

class Config { 
    private static $_singleton; 
    private $xml; 
    static function getInstance() { 
     if(is_null (self::$_singleton)) { 
       self::$_singleton = new self; 
     } 
     return self::$_singleton; 
    } 
    function open($xml_file) { 
     $this->xml = simplexml_load_file($xml_file); 
     return $this; 
    } 
    public function getConfig($path=null) { 
     if (!is_object($this->xml)) { 
      return false; 
     } 
     if (!$path) { 
      return $this->xml; 
     } 
     $xml = $this->xml->xpath($path); 
     if (is_array($xml)) { 
      if (count($xml) == 1) { 
       return (string)$xml[0]; 
      } 
      if (count($xml) == 0) { 
       return false; 
      } 
     } 
     return $xml; 
    } 
} 

例call

Config::getInstance() 
    ->open('settings.xml') 
    ->getConfig('/settings/module/section/item'); 
+0

スピードはどうですか?私はXPathがあまり速くないと思います。 –

+1

スピード?それはあなたのアプリケーションとその実装方法に依存します。 ZendフレームワークはXML構成を使用します(とりわけ)。すべてが相対的です。 –

+1

ループなどで設定ファイルにヒットすると、パフォーマンスが低下します。もちろん、ループを入力する前に、変数の設定値を割り当てることで簡単に回避できます。 –

0

私はあなたが持つことができ、 "名前空間" やツリー

のいくつかの種類を持っていることのアイデアを気に入っ:

db.default.user 

または

db.readonly.user 

など。今私が何をしたかのコードに関する

はコンフィグ読者のためのインターフェースだった:あなたはメモリリーダ、アレイリーダー、デシベルリーダーなど

と読者を使用して設定クラスを持っており、許可することができ、あなたは持っています設定として保存

; <?php die('Direct access not allowed ;') ?> 
; The above is for security, do not remove 

[database] 
name = testing 
host = localhost 
user = root 
pass = 

[soap] 
enableCache = 1 
cacheTtl = 30 

:ソース

5

どの程度の任意の種類から設定。PHP(またはそのような何か、PHPの拡張子を持っている必要があります)、その後、ただでそれをロードします。

parse_ini_file('config.php', true); 

そして、あなたはより具体的な設定ファイルで、デフォルトの設定ファイルをマージする

array_merge_recursive(parse_ini_file('config-default.php', true), parse_ini_file('config.php', true)) 

を使用することができます。

ここで重要な点は、読みやすいini形式を使用できますが、引き続きパブリックディレクトリに設定ファイルを置くことができることです。 ブラウザでファイルを開くと、phpはまずそれを解析して結果を返します。これは ";直接アクセスが許可されていません"です。ファイルを直接iniファイルとして解析すると、phiのdie文はini構文(;)に従ってコメントアウトされるため、効果はありません。

2

私の見解では、良い解決策はiniファイルです。

設定を保存するために配列/変数を使用する設定ファイルを好むわけではありません。理由は次のとおりです。

ユーザーが誤って設定変数の名前を変更した場合はどうなりますか?
似たような名前の変数がユーザーによっても他の場所で定義されている場合はどうなりますか?
設定ファイルの変数は、スクリプトやインクルードファイルのどこかで上書きされることがあります。
...

私のPHPアプリケーションの設定には、iniファイルを使用します。それは
ベースのセクションでは、何のものが存在しないので、それはあなたが変数を心配する必要はありません
フレンドリ名で値を設定することができ
簡単には上書きされている

:理由はここにあります。
もちろん、変数の競合はありません。 これにより、より柔軟に値の型を指定することができます。

注:parse_ini_file関数を使用してiniファイルを読み取る必要があります。

関連する問題