このプロジェクトは実際には新しいアイデアではありません。これは Weibo に来て最初の最適化プロジェクトで作成した小さなツールです。Weibo_Conf と呼ばれています。しかし、Weibo_Conf は Weibo の拡張機能であるため、他の機能も特別に用意されていますWeibo 用にカスタマイズされているため、直接のオープン ソースには適していません。
PHP7 のリリースにより、IS_IMMUTABLE_ARRAY などの多くの新しい永続タイプが追加されたため、誰もが利用できるオープン ソースである PHP7 で Yaconf を再開発しました。
#はじめに
まず、これが何をするのかについて話しましょう。私は、設定に PHP ファイルを使用する多くのプロジェクトを見てきました。 config ディレクトリには、さまざまな配列を含む .php 設定ファイルが数十、さらには数十存在する可能性があり、一部の辞書ファイル (中国語/英語コントロールなど) も設定に含まれます。これにより、 (確かに、opcache を使用したほうが良いかもしれませんが、実際にはまだ実行プロセスが存在します)。PHP を除く json と yaml を使用するものもあります。共通の特徴は次のとおりです。これらの構成は可読性が比較的低いです。さらに、実行時の分析も必要です。構成ディレクトリはコードと一緒に存在することがよくあります。まず、セキュリティ リスクがあります (構成には機密情報が含まれることがよくあります)。次に、構成とコードが同じプロジェクトに属している場合、構成の変更はオンラインでコードのプロセスを経ることになります。一部のリソース構成ファイル (mysql/memcache 構成情報など)内容は開発に対して透過的である必要があり、運用と保守が直接責任を負うことができますが、それがコードに組み込まれている場合、運用と保守が何らかの変更を開始したい場合は、開発と協力を変更して構成ファイルを変更してオンラインにする必要があります.つまり、Yaconf は、これらの問題を解決するために作成されたツールです。これは、コードと一緒ではなく、別の構成ディレクトリ (yaconf.directory で指定) を使用します。 PHP の起動時に処理されるすべての構成を処理します。その後、これらの構成はメモリ内に常駐し、PHP のライフ サイクルとともに生きたり消えたりします。要求されるたびに構成ファイルを解析する必要がなくなります。すべて 設定内容はすべて不変であるため、Fork の COW を利用してメモリ使用量を削減でき、設定にアクセスする際にメモリ コピーがほとんど必要なく、参照カウントの不必要な増減もありません最も重要なことは、構成ディレクトリとコードを分離した後、構成管理のバックグラウンドを使用して構成の統合管理を実現できることです。(非 ZTS の) リロードをサポートします。構成の変更、つまり構成に変更がある場合 (構成を変更するには cp の代わりに mv を使用することをお勧めします)、再ロードされ、再起動する必要はありません (検出の頻度は yaconf によって制御されます) 文字列、配列、セクション、セクション継承などのさまざまな構成タイプがサポートされており、PHP 定数や環境変数を構成内に直接記述することもできます。最も重要なことは、それが非常にシンプルであるということです。
API
Yaconf には 2 つのメソッドしかありません。
mixed Yaconf::get(string $name, mixed $default = NULL)これは、構成を取得するためのものです。 name は構成の名前で、一般的に言えば、 foo.ini という ini ファイルがある場合、 $name が foo を使用すると、このファイル内のすべての内容が取得され、配列の形式で返されます。構成が存在しない場合に返されるデフォルト値。
bool Yaconf::has(string $name)これは、構成が存在するかどうかを検出するためのものです。
Yaconf 構成項目
yaconf.directoryConfigurationファイル ディレクトリの場合、この設定は PHP の起動時に決定する必要があるため、ini_set では指定できません。
yaconf.check_delayファイルの変更を検出する頻度 (秒)。0 の場合、検出されません。つまり、0 の場合、ファイルの変更は PHP を再起動することによってのみリロードできます。
#設定された形式
#Yaconf は、ini ファイルを設定ファイルとして使用します。 ini が設定ファイルに最も適していると常に感じていました。キーと値の形式で、明確で読みやすいです。簡単な設定の記述は次のようになります (以下はすべて ini ファイルの名前を前提としています) is test):
foo="bar" phpversion=PHP_VERSION env=${HOME}
上記のように、一般的な設定には引用符を使用します。引用符で囲まれていないものについては、PHP 定数を使用してみます。説明、つまり、PHP 定数を記述できます
さらに、上記の env:
Yaconf::get("test.env"); //test是配置文件名字 //string(16) "/home/huixinchen"
のように、環境変数を構成内に直接記述できることもわかります。上記のように、次のことがわかります。次のコードを通じて foo の値にアクセスできると仮定します。
Yaconf::get("test.foo"); //test是配置文件名字
Yaconf は、次のように記述される配列型の構成もサポートしています。
arr.0=1 arr.1=2
が連続配列の場合、直接書くこともできます:
arr[]=1 arr[]=2
次に、配列の値については、次のコードを通じて取得できます:
Yaconf::get("test.arr");
これにより、テスト構成ファイル内の arr 配列が取得されます。配列内の特定の値を直接取得することもできます。たとえば、テスト構成ファイル内の arr 配列の 0 番目の要素を直接取得したい場合:
$arr = Yaconf::get("test.arr.0");
Yaconf は、マップ タイプの構成もサポートしています。次のように記述します。
map.foo=bar map.bar=foo
;セミコロンを使用してコメントを書くことができます
map2.foo.name=yaconf map2.foo.year=2015
map2 の foo サブマップの名前の値には、次の形式でアクセスできます:
Yaconf::get("test.map2.foo.name"); //test是配置文件名字
また、設定ファイルはセクションとセクション継承に分割することもできます:
[parent] parent="base" children="NULL" [children : parent] children="children"
設定セクションの継承構文 Children: (コロン)parent に注意してください。これは、子セクションがすべての基本設定項目を継承することを意味します。次に、子セクションで定義します。親セクションと同じ名前の構成は、親で定義されている内容を上書きします。
childlren セクションの子の構成の値は、次の場所でアクセスできます。形状:###
Yaconf::get("test.children.children"); //test是配置文件名字
样例
首先, 假设我们的所有的配置文件都放置在/tmp/yaconf中, 那么我们就需要在php.ini中增加如下配置:
yaconf.directory=/tmp/yaconf
这样yaconf在PHP启动的时候, 就会在这个目录下找所有的*.ini文件, 然后尝试处理他们. 这里要注意的是不支持多级目录, 也就是说, yaconf只会处理yaconf.directory内的*.ini文件, 不会处理子目录里面的(这主要是为了简单考虑, 因为有分节, 你就可以一个项目定义一个ini文件).
假设/tmp/yaconf下有俩个ini文件, 分别是:
foo.ini
name="yaconf" year=2015 features[]="fast" features.1="light" features.plus="zero-copy" features.constant=PHP_VERSION bar.ini
[base]
parent="yaconf" children="NULL" [children:base] children="set"
然后对于foo的内容:
php7 -r 'var_dump(Yaconf::get("foo"));' /* array(3) { ["name"]=> string(6) "yaconf" ["year"]=> string(4) "2015" ["features"]=> array(4) { [0]=> string(4) "fast" [1]=> string(5) "light" ["plus"]=> string(9) "zero-copy" ["constant"]=> string(9) "7.0.0-dev" } } */
对于bar的内容:
php7 -r 'var_dump(Yaconf::get("bar"));' /* array(2) { ["base"]=> array(2) { ["parent"]=> string(6) "yaconf" ["children"]=> string(4) "NULL" } ["children"]=> array(2) { ["parent"]=> string(6) "yaconf" ["children"]=> string(3) "set" } } */
当然你可以用 (.)链接语法精确访问任何一个特定的值.
最后
我的Ya系列扩展从此又多了一个新成员, 算上之前的Yaf(PHP框架), Yar(PHP RPC框架), Yac(PHP单机缓存), 大家就可以很容易搭建一套高性能的LAMP应用解决方案出来.
注: Yaconf要求PHP7才能用
推荐教程:《PHP7》
以上がPHP7 の Yaconf 使用チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。