16

仕事では、フレームワークの残りの部分を呼び出す前に、.iniファイルを使用して変数を設定します(

function getConfigVars(){
    //read my_config.ini file
    ....
    //call framework
}

そして、私はいつも、そのようにすることには利点があるのだろうかと思っていました。

次に、アクセスルールを作成して、人々がWebからそれを見るのを防ぎ、phpがそれを解析して理解する必要があるように思われます。

では、なぜmy_config.phpではなくmy_config.iniを使用するのでしょうか。セットアップ後に誰かがそれに触れる必要があるわけではなく、変数を呼び出すだけで、ini変数を使用している場所でIDEにテキストをオートコンプリートさせたり、エラーを解析したりできる方が便利なようです。

4

4 に答える 4

16

解析する必要がある INI ファイルと、単純にインクルードされる (そして PHP によってキャッシュできる) PHP ファイルの使用の間にパフォーマンスの違いがあるかどうかを知りたいために、この質問に来る人: はい、違いはありますが、それらは非常に小さいため、実際には問題になりません。

私のベンチマーク シナリオは、config.ini20 個のキーと値のペアを含むconfig.phpファイルと、定義どおりに記述された同じ 20 個のキーと値のペアを含むファイルです。PHP のバージョンは、Ubuntu Linux 13.04 では 5.4.9 です。

key1 = value1
...
key20 = value20

対。

<?php
define("key1", "value1");
...
define("key2", "value20");

構成を含む 2 つのテスト スクリプト:

<?php
$CONF = parse_ini_file("config.ini");

対。

<?php
require_once "config.php";

でパフォーマンスをテストしましたab -c 25 -n 10000

PHP キャッシュなしの結果:

ini: Requests per second:    2660.89 [#/sec] (mean)
php: Requests per second:    2642.28 [#/sec] (mean)

APC PHP キャッシュでの結果:

ini: Requests per second:    3294.47 [#/sec] (mean)
php: Requests per second:    3307.89 [#/sec] (mean)

テストを複数回実行しました。当然のことながら、数値は毎回異なりますが、コンセンサスは次config.iniのとおりです。PHP キャッシュを使用config.phpしないと少し速くなり、PHP キャッシュを使用すると少し速くなります。しかし、違いは非常に小さいため、パフォーマンスに基づいて決定するべきではありません。

于 2013-05-17T07:11:31.290 に答える
11

確かに、あなたの質問は公正な点を提起します。

.iniファイルを支持するいくつかのポイント:

  • 別の言語でファイルを使用してください。Perl、Python、Rubyなどのスクリプトでその言語で特に簡単なことを実行し、プロジェクト設定にアクセスする必要がある場合は、設定をPHPファイルに保存すると不運になります。

  • データの人間による編集。あなたはあなたの質問でそれを却下しましたが、意図があるかどうかにかかわらず、誰かがそこに突っ込んでしまう可能性が非常に高く、技術的な個人ではない可能性があります。INI形式は、単なる変数宣言の集まりであっても、PHPコードよりもはるかに怖いものではありません。

  • 設定を更新しています。PHPファイルを作成するよりも、新しいINIファイルを作成する方がはるかに簡単だと思います。これはかなり主観的ですが、言及する価値があります。

  • 設定変数間の関係。INIファイルを使用して設定に階層を設定するのはかなり簡単で直感的です。これはPHPでも可能ですが、情報を格納するために深くネストされた連想配列を実行しようとすると、見苦しくなります。

これらに加えて、ほとんどのPHPプロジェクト(少なくとも私が参加しているプロジェクト)はルートからかなりの量のコードを保持しているため、「Webアクセスから保護する必要がある」というINIのノックオンはほとんどのシナリオに関係ありません。フォルダ、および設定は通常そこに行きます。

于 2009-05-05T04:35:14.940 に答える
10

Zend Frameworkには、ini 形式 ( Zend_Config_Ini ) で記述されたファイルを解析する構成解析が含まれています。これを使用しているように思えます。

構成ファイルはドキュメント ルートに配置しないでください。ドキュメント ルートに配置しない場合は、誰もアクセスできないため、書き換えルールは必要ありません。

INI 形式は、構成データ キーの階層を持つ機能と構成データ セクション間の継承の両方を提供するように特化されています。構成データ階層は、キーをドットまたはピリオド文字 (.) で区切ることによってサポートされます。セクションは、セクション名の後にコロン文字 (:) と、データが継承されるセクションの名前を続けることによって、別のセクションから拡張または継承することができます。

Zend_Config_Iniページから。

Zend Framework はこれを使用して、ステージング用、開発用、本番用の複数の構成パラメーターを使用できるようにします。これにより、本番用と開発用のデータベース設定を簡単に設定でき、2 つの非常に異なる設定を持つことができます。インクルードが配置されている場所への ini ファイルに設定されたさまざまなパス。これにより、開発中のすべてのものがすぐにオフになることがわかっているため、コードを開発から本番に移行するのがはるかに簡単になります。

確かに、これは PHP スクリプトで可能ですが、さまざまな構成変数の解析と if/then チェックを行う必要がありますが、parse_ini_file() を使用すると、これらすべてが自動的に行われます。

他の回答では、プログラマー以外が変数や、構成変数として設定されている Web サイト上の何か (たとえば、サイト レイアウトで使用されるサイト タイトル) を変更する必要がある可能性があることも既に指摘されています。INI ファイルは、プログラミングの経験がない人でも理解しやすく、読みやすいものです。

私が現在取り組んでいるウェブサイトの例:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.db.adapter       = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users.db"

resources.view[] =

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users-testing.db"

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users-dev.db

これにより、コードを実行できるさまざまな環境用に複数のデータ セットを用意することが非常に簡単になります。

于 2009-05-05T04:40:34.583 に答える
1

プログラマーでない人にとっては、構成変数を変更する方が簡単かもしれません...それが職場で必要な場合。

の注意深い配置を発見し、<?phpそれ?>が表示されないようにすることができますが、parse_ini_file()はファイルから関連データを取得します。

ただし、セキュリティで保護する最善の方法は、docrootの上に配置し、サーバー設定で*.iniへのアクセスを拒否することです。

于 2009-05-05T04:34:00.093 に答える