이 프로젝트는 사실 새로운 아이디어는 아니지만 Weibo_Conf라는 첫 번째 최적화 프로젝트에서 만든 작은 도구입니다. 함수는 Weibo용으로 특별히 맞춤 제작되었기 때문에 직접 오픈 소스에는 적합하지 않습니다.
PHP7이 출시되면서 IS_IMMUTABLE_ARRAY와 같은 새로운 지속성 유형이 많이 추가되었으므로 Yaconf를 PHP7에서 다시 개발하여 모든 사용자를 위한 오픈 소스로 만들었습니다. 사용.
소개
우선 이것이 무엇인지 이야기해 봅시다.
구성 디렉토리에 PHP 파일을 사용하는 많은 프로젝트가 있을 수 있습니다. . PHP 구성 파일에는 다양한 배열이 포함되어 있으며 일부 사전 파일(예: 중국어/영어 비교)도 구성에 배치됩니다. 이로 인해 구성 파일을 구문 분석하면 많은 성능이 소모됩니다(물론 opcache를 사용하는 것이 더 좋습니다.) 하지만 실제로는 아직 실행 프로세스가 있습니다.) PHP 외에도 json 및 yaml도 있는데, 이러한 구성의 일반적인 특징은 런타임별로 구문 분석해야 한다는 것입니다. 구성 디렉터리는 코드와 함께 있는 경우가 많습니다. 우선 보안 위험이 있습니다(구성에 민감한 정보가 포함되는 경우가 많습니다). 둘째, 구성과 코드가 동일한 프로젝트에 속하는 경우 구성 수정이 발생합니다. . 온라인에서 코드를 작성하는 과정
mysql/memcache의 구성 정보와 같은 일부 리소스 구성 파일은 개발에 투명해야 하며, 운영 및 유지 관리는 직접적으로 책임져야 합니다. 일부 변경을 시작하려면 구성 파일을 개발하고 수정하여 온라인으로 전환해야 합니다.
그래서 Yaconf는 이러한 문제를 해결하기 위해 태어난 도구입니다.
별도의 구성 디렉터리( yaconf.directory에 지정됨), 이는 Together의 코드와 동일하지 않습니다.
PHP가 시작될 때 처리될 모든 구성을 처리하며, 이러한 구성은 PHP의 수명 주기와 함께 메모리에 상주하게 됩니다. PHP. 요청될 때마다 구성 파일을 구문 분석하지 않습니다.
All 구성 내용은 모두 변경 불가능하므로 구성에 액세스할 때 메모리 복사가 거의 필요하지 않습니다. , 참조 횟수가 불필요하게 증가하거나 감소하지 않습니다
가장 중요한 것은 예, 구성 디렉터리와 코드가 분리된 후 구성 관리 배경을 사용하여 구성의 통합 관리를 달성할 수 있습니다.
지원합니다. (ZTS가 아닌 경우) 구성 변경 사항 다시 로드, 즉 구성이 변경되면(특정 기간 동안 구성을 변경하는 것이 좋습니다) mv를 사용하고 cp를 사용하지 않음) 다시 로드하므로 필요하지 않습니다. (탐지 빈도는 yaconf.check_delay에 의해 제어됩니다.)
문자열, 배열, 섹션, 섹션 상속을 포함한 풍부한 구성 유형을 지원하며 구성에서 PHP 상수 및 환경 변수를 직접 작성할 수도 있습니다. 중요한 것은 매우 간단하다는 것입니다.
APIYaconf는 두 가지 방법만 제공합니다.
mixed Yaconf::get(string $name, mixed $default = NULL)
이것은 구성을 가져오는 것입니다. 이름은 일반적으로 ini 파일이 있는 경우 구성의 이름입니다. foo.ini를 호출한 다음 $name에 foo를 사용하면 파일의 모든 내용을 가져와 배열 형식으로 반환합니다. 구성이 존재하지 않으면 기본값이 반환됩니다.bool Yaconf::has(string $name)
yaconf.directory
구성 파일 디렉터리. 이 구성은 PHP가 시작될 때 결정되어야 하기 때문에 ini_set를 통해 지정할 수 없습니다.
yaconf.check_delay
파일 변경 사항을 감지하는 빈도(초) 0이면 감지되지 않습니다. 즉, 0이면 PHP를 다시 시작해야만 파일 변경 사항을 다시 로드할 수 있습니다
구성 형식Yaconf는 ini 파일을 구성 파일로 사용합니다. 항상 ini가 키-값 형식으로 명확하고 읽기 쉬운 구성 파일에 가장 적합하다고 느꼈습니다.
간단한 구성은 다음과 같이 작성됩니다(다음은 모두 ini 파일 이름이 test라고 가정합니다).foo="bar"
phpversion=PHP_VERSION
env=${HOME}
또한 볼 수 있습니다. 이제 위의 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"
참고 구성 섹션 상속 구문은 하위:(콜론) 상위입니다. 이는 하위 섹션이 모든 기본 구성 항목을 상속한다는 의미입니다. 상위 섹션과 동일한 이름을 가진 하위 섹션은 상위 콘텐츠에 정의된 구성을 재정의합니다.
childrenlren 섹션의 하위 구성 값은 다음 형식으로 액세스할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!