Ce projet n'est en fait pas une idée nouvelle. Il s'agit d'un petit outil que j'ai créé dans mon premier projet d'optimisation après mon arrivée sur Weibo. Mais comme Weibo_Conf est une extension Weibo, il existe d'autres fonctions spécialement personnalisées. pour Weibo, ils ne conviennent donc pas à l'open source direct
Avec la sortie de PHP7, de nombreux nouveaux types de persistance ont été ajoutés, comme IS_IMMUTABLE_ARRAY, j'ai donc redéveloppé Yaconf sous PHP7, open source pour tout le monde. utiliser.
Introduction
Tout d'abord, parlons de ce que cela fait.
J'ai vu de nombreux projets, utilisant des fichiers PHP pour la configuration, il peut y avoir une douzaine, voire des dizaines de fichiers de configuration .php dans un répertoire de configuration, qui contiennent divers tableaux, et même certains fichiers de dictionnaire (tels que chinois/anglais (Contrôle) sont également placés dans la configuration. Cela provoque l'analyse du fichier de configuration pour consommer beaucoup de performances (certes, utiliser opcache peut être mieux, mais en fait il y a quand même un processus d'exécution
En plus de PHP, il y a aussi ceux qui utilisent json et yaml). est que la lisibilité de ces configurations est relativement mauvaise. De plus, elles nécessitent également une analyse d'exécution
Le répertoire de configuration est souvent accompagné du code. Premièrement, il y aura des risques de sécurité (il contient souvent des informations sensibles). la configuration). Deuxièmement, si la configuration et le code appartiennent au même projet, cela entraînera que la modification de la configuration passe par le processus de code en ligne.
Certains fichiers de configuration de ressources, tels que mysql/memcache Informations de configuration, ce contenu doit être transparent pour le développement, et l'exploitation et la maintenance doivent être directement responsables. Cependant, si elles sont insérées dans le code, si l'exploitation et la maintenance veulent initier des changements, le développement et la coopération doivent être modifiés pour modifier la configuration. fichier et allez en ligne.
Ainsi, Yaconf est un outil créé pour résoudre ces problèmes
Il utilise un répertoire de configuration séparé (spécifié dans yaconf.directory), et non avec le code.
Il gère toutes les configurations à traiter au démarrage de PHP, puis ces configurations résideront en mémoire et vivront et mourront avec le cycle de vie de PHP. Cela évite d'analyser le fichier de configuration à chaque fois qu'il est demandé. >
Tous les contenus de configuration sont tous immuables, ce qui peut réduire l'utilisation de la mémoire à l'aide de Fork's COW. Lors de l'accès à la configuration, il n'y a presque pas besoin de copie de mémoire, et il n'y aura pas d'augmentation ou de diminution inutile du contenu. nombre de référencesLa chose la plus importante est qu'une fois le répertoire de configuration et le code séparés, un arrière-plan de gestion de configuration peut être utilisé pour obtenir une gestion unifiée de la configuration.Il prend en charge (pour les non- ZTS) rechargement des changements de configuration, c'est-à-dire configuration S'il y a des changements (il est recommandé d'utiliser mv au lieu de cp pour changer la configuration), il se rechargera sans redémarrer (la fréquence de détection est contrôlée par yaconf.check_delayIl prend en charge une variété de types de configuration, notamment les chaînes, les tableaux, les sections, l'héritage de section, et vous pouvez également écrire des constantes PHP et des variables d'environnement directement dans la configuration
La chose la plus importante est, c'est très simple.
APIYaconf ne propose que deux méthodes,
mixed Yaconf::get(string $name, mixed $default = NULL)
C'est pour obtenir une configuration, le nom est le nom de la configuration, d'une manière générale, si vous avez un fichier ini appelé foo.ini , alors si $name utilise foo, il obtiendra tout le contenu de ce fichier et le renverra sous la forme d'un tableau par défaut est la valeur par défaut renvoyée lorsque. la configuration n'existe pas.
bool Yaconf::has(string $name)
Ceci permet de détecter si une configuration existe.
Éléments de configuration Yaconfyaconf.directory
yaconf.check_delay
À quelle fréquence (en secondes) détecter les modifications de fichier S'il est 0, il ne sera pas détecté. il est 0, les modifications de fichiers ne peuvent être rechargées qu'en redémarrant PHP
Format configuréYaconf utilise les fichiers ini comme fichiers de configuration. ini est le plus approprié pour les fichiers de configuration. Il est au format clé-valeur et est clair et lisible
Écriture de configuration simple Cela ressemble à ceci (tout ce qui suit suppose que le nom du fichier ini est test). :
foo="bar" phpversion=PHP_VERSION env=${HOME}
Comme indiqué ci-dessus, nous utilisons des guillemets pour les configurations générales. Pour celles qui ne sont pas citées, nous allons essayer d'utiliser des constantes PHP Explication, c'est-à-dire que nous pouvons écrire des constantes PHP directement dans le fichier. configuration.
De plus, vous pouvez également voir que nous pouvons écrire des variables d'environnement directement dans la configuration, comme le ci-dessus env:
Yaconf::get("test.env"); //test是配置文件名字 //string(16) "/home/huixinchen"
Comme indiqué ci-dessus, vous pouvez voir qu'en supposant que le la valeur de foo est accessible via le code suivant :
Yaconf::get("test.foo"); //test是配置文件名字
Yaconf prend également en charge la configuration de type tableau, qui s'écrit comme suit :
arr.0=1 arr.1=2
Si c'est le cas pour un tableau continu, vous pouvez également écrire directement :
arr[]=1 arr[]=2
Ensuite pour la valeur du tableau, vous pouvez l'obtenir via le code suivant :
Yaconf::get("test.arr");
Cela obtiendra le tableau arr dans le fichier de configuration de test Bien sûr. Vous pouvez également. obtenir directement une valeur spécifique dans le tableau. Par exemple, si vous souhaitez obtenir directement le 0ème élément du tableau arr dans le fichier de configuration de test :
$arr = Yaconf::get("test.arr.0");
Yaconf prend également en charge la configuration du type map, qui s'écrit comme suit :
map.foo=bar map.bar=foo
; Vous pouvez utiliser des points-virgules pour écrire des commentaires
map2.foo.name=yaconf map2.foo.year=2015
La valeur du nom de la sous-carte foo de map2 est accessible sous la forme suivante :
Yaconf::get("test.map2.foo.name"); //test是配置文件名字
De plus, le Le fichier de configuration peut également être divisé en section et héritage de section :
[parent] parent="base" children="NULL" [children : parent] children="children"
Veuillez noter la syntaxe d'héritage de la section de configuration children : (deux-points) parent, ce qui signifie que la section enfants hérite de tous les éléments de configuration de base. Ensuite, vous la définissez. dans la section enfants La configuration du même nom que dans la section parent écrasera le contenu défini dans le parent
La valeur de la configuration enfants dans la section enfants est accessible sous la forme suivante : <🎜. >
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》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!