<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/refs.basic.other.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'book.yaconf.php',
    1 => 'Yaconf',
    2 => 'Yaconf',
  ),
  'up' => 
  array (
    0 => 'refs.basic.other.php',
    1 => '其它基本扩展',
  ),
  'prev' => 
  array (
    0 => 'class.yaf-exception-loadfailed-view.php',
    1 => 'Yaf_Exception_LoadFailed_View',
  ),
  'next' => 
  array (
    0 => 'yaconf.setup.php',
    1 => '安装/配置',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'reference/yaconf/book.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/book.yaconf.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="book.yaconf" class="book">
 
 <h1 class="title">Yaconf</h1>
 

 <div id="intro.yaconf" class="preface">
  <h1 class="title">简介</h1>
  <p class="simpara">
   <code class="literal">Yet Another Configurations Container</code>（又一个配置容器，
   简称 <abbr>Yaconf</abbr>）是一个配置容器。它在 PHP 启动时解析
   <code class="literal">INI</code> 文件，并将解析结果常驻保存在内存中，贯穿 PHP
   的整个生命周期。因此每一次读取配置都是一次快速的哈希表查找，
   既没有文件 I/O，也不需要每个请求重新解析。
  </p>
  <p class="simpara">
   Yaconf 把所有配置以驻留字符串（interned string）或不可变数组的形式存储。
   它们不参与引用计数，所以从 Yaconf 读取配置几乎是零拷贝的。
   从 Yaconf 1.2.0 起，解析后的整棵配置树还会被进一步压缩到一块连续的
   内存中，既降低了内存开销，也提升了缓存局部性。
  </p>
  <p class="simpara">
   解析后的配置保存在持久内存中，所有 PHP-FPM worker 通过写时复制
   （copy-on-write）共享这份数据：只要配置文件没有变化，无论有多少个
   worker，它们共享的都是同一份物理内存页。
  </p>
  <p class="simpara">
   Yaconf 支持 INI 文件中的 section（节）以及节继承。在非 ZTS 构建下，
   它还会在文件变更时自动重新加载；在 ZTS（线程安全）构建下，
   配置只在启动时加载一次，变更后需要重启 PHP 才能生效。
  </p>
  <p class="simpara">
   从 Yaconf 1.2.0 起，配置目录下的子目录会被递归加载（最多 16 层深），
   子目录名作为一级键参与寻址：例如
   <code class="literal">Yaconf::get(&quot;users.database.master&quot;)</code> 读取的是
   <var class="filename">users/</var> 子目录下 <var class="filename">database.ini</var>
   文件里的 <code class="literal">master</code> 键。
  </p>
  <p class="simpara">
   把敏感配置放在 Web 目录之外，也可以缩小攻击面。如果配置文件放在
   Web 根目录下，攻击者就可能拿到它们，比如通过文件泄露漏洞。
   而使用 Yaconf，可以把 <var class="filename">.ini</var> 文件放在只有
   root 可读的目录里，例如 <var class="filename">/etc/yaconf</var>：
   PHP-FPM master 进程在服务启动时加载配置，而实际处理 Web 请求的
   worker 进程以普通用户身份运行，既不需要、也不会被授予对该目录的
   访问权限。
  </p>
  <p class="simpara">
   Yaconf 需要 PHP 7.0 及以上版本。
  </p>
 </div>

 







 








<ul class="chunklist chunklist_book"><li><a href="yaconf.setup.php">安装/配置</a><ul class="chunklist chunklist_book chunklist_children"><li><a href="yaconf.requirements.php">需求</a></li><li><a href="yaconf.installation.php">安装</a></li><li><a href="yaconf.configuration.php">运行时配置</a></li><li><a href="yaconf.resources.php">资源类型</a></li></ul></li><li><a href="class.yaconf.php">Yaconf</a> — Yaconf 类<ul class="chunklist chunklist_book chunklist_children"><li><a href="yaconf.debug-info.php">Yaconf::__debug_info</a> — 查看某个配置值的存储方式</li><li><a href="yaconf.get.php">Yaconf::get</a> — 按名称读取一个配置值</li><li><a href="yaconf.has.php">Yaconf::has</a> — 检查某个配置值是否存在</li></ul></li></ul></div><?php manual_footer($setup); ?>