1
0
mirror of https://github.com/php/doc-zh.git synced 2026-03-23 22:52:08 +01:00
Files
archived-doc-zh/install/ini.xml
Louis-Arnaud 8ea9542a94 Fix install/: untranslated text, typos, translation errors (#1020)
- unix/openbsd.xml: translate untranslated English paragraphs
- fpm/configuration.xml: fix <type>in</type> → <type>int</type> typo
- unix/nginx.xml: fix duplicated SAPI SAPI → FPM SAPI
- ini.xml: fix virtualhost → ini_set translation error
2026-03-17 18:44:53 +08:00

484 lines
18 KiB
XML
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 9ab074d32484672f93e5d822f42fb94ae9088207 Maintainer: dallas Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<chapter xml:id="configuration" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>运行时配置</title>
<sect1 xml:id="configuration.file">
<title>配置文件</title>
<simpara>
配置文件(&php.ini;)在 PHP 启动时被读取。对于服务器模块版本的 PHP仅在 web
服务器启动时读取一次。对于
<acronym>CGI</acronym><acronym>CLI</acronym> 版本,每次调用都会读取。
</simpara>
<para>
&php.ini; 的搜索路径如下(按顺序):
<itemizedlist>
<listitem>
<simpara>
SAPI 模块所指定的位置Apache 2 中的 <literal>PHPIniDir</literal>
指令CGI 和 CLI 中的 <literal>-c</literal>
命令行选项)。
</simpara>
</listitem>
<listitem>
<simpara>
<varname>PHPRC</varname> 环境变量。
</simpara>
</listitem>
<listitem>
<simpara>
可以为不同版本的 PHP 指定不同的 <literal>php.ini</literal>
文件位置。注册表目录所在的位置取决于你的系统是 32 位还是 64 位。32-bit
的 PHP 运行在 32-bit 的系统或 64-bit 的 PHP 运行在 64-bit 系统时使用 <literal>[(HKEY_LOCAL_MACHINE\SOFTWARE\PHP]</literal>
32-bit 的 PHP 运行在 64-bit 的系统上时,则使用 <literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]</literal>] 替代。
系统版本跟 PHP 版本架构一致时,会按以下顺序依次进行检查:
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]</literal>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]</literal>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]</literal>,其中的
xy 和 z 指的是 PHP 主版本号,次版本号和发行批次。
对于 32 bit 版本的 PHP 运行在 64 bit 系统上的情况,则会按以下顺序依次进行检查:
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]</literal>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]</literal>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]</literal>,其中的
xy 和 z 指的是 PHP 主版本号,次版本号和发行批次。如果在其中任何目录下的
<literal>IniFilePath</literal> 有键值,则第一个值将被用作
<literal>php.ini</literal> 的位置(仅适用于 Windows
</simpara>
</listitem>
<listitem>
<simpara>
<literal>[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]</literal><literal>IniFilePath</literal> 的值Windows 注册表位置)。
</simpara>
</listitem>
<listitem>
<simpara>
当前工作目录(对于 CLI
</simpara>
</listitem>
<listitem>
<simpara>
web 服务器目录(对于 SAPI 模块)或 PHP 所在目录Windows 下其它情况)。
</simpara>
</listitem>
<listitem>
<simpara>
Windows 目录(<filename class="directory">C:\windows</filename>
<filename class="directory">C:\winnt</filename>),或
<literal>--with-config-file-path</literal> 编译时选项指定的位置。
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
如果存在 <filename>php-SAPI.ini</filename>SAPI 是当前所用的 SAPI
名称,因此实际文件名为 <filename>php-cli.ini</filename>
<filename>php-apache.ini</filename> 等),则会用它替代 &php.ini;。SAPI
的名称可以用 <function>php_sapi_name</function> 来测定。
</para>
<note>
<para>
Apache web 服务器在启动时会把目录转到根目录,这将导致 PHP 尝试在根目录下读取
&php.ini;,如果存在的话。
</para>
</note>
<simpara>
可以在如下所示的 &php.ini; 配置值中引用环境变量。自 PHP 8.3.0 起,可以指定一个后备值,当引用的变量未定义时使用该值。
</simpara>
<example>
<title>&php.ini; 中的环境变量</title>
<programlisting role="ini">
<![CDATA[
; PHP_MEMORY_LIMIT 来自于环境变量的值
memory_limit = ${PHP_MEMORY_LIMIT}
; 如果 PHP_MAX_EXECUTION_TIME 未定义,将回退到 30
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
]]>
</programlisting>
</example>
<para>
由扩展库处理的 &php.ini; 指令,其文档分别在各扩展库的页面。<link
linkend="ini">内核配置选项</link>见附录。不过也许不是所有的 PHP
指令都在手册中有文档说明。要得到自己的 PHP 版本中的配置指令完整列表,请阅读
&php.ini; 文件,其中都有注释。此外,也许从 Git 得到的<link
xlink:href="&url.php.git.phpini;">最新版 &php.ini;</link> 也有帮助。
</para>
<para>
<example>
<title>&php.ini; 示例</title>
<programlisting role="ini">
<![CDATA[
; any text on a line after an unquoted semicolon (;) is ignored
[php] ; section markers (text within square brackets) are also ignored
; Boolean values can be set to either:
; true, on, yes
; or false, off, no, none
register_globals = off
track_errors = yes
; you can enclose strings in double-quotes
include_path = ".:/usr/local/lib/php"
; backslashes are treated the same as any other character
include_path = ".;c:\php\lib"
]]>
</programlisting>
<!-- TODO: add more details about values and expressions -->
</example>
</para>
<para>
在 .ini 文件内可能会引用已存在的 .ini
变量。例如:<literal>open_basedir = ${open_basedir}
":/new/dir"</literal>
</para>
<sect2 xml:id="configuration.file.scan">
<title>扫描路径配置</title>
<para>
可以通过配置,让 PHP 在读完 &php.ini; 后,扫描指定路径中的附加 .ini 配置文件。编译时通过
<option role="configure">--with-config-file-scan-dir</option>
参数来指定要扫描的目录。扫描路径也可以通过环境变量
<varname>PHP_INI_SCAN_DIR</varname> 来设置。
</para>
<para>
通过在扫描路径配置中加入特定系统的目录分隔符Windows、NetWare
和 RISC OS 下是 <literal>;</literal>;其它操作系统下是 <literal>:</literal>;该值可以通过
PHP 常量 <constant>PATH_SEPARATOR</constant> 获取),还可以设置多个扫描路径。如果
<varname>PHP_INI_SCAN_DIR</varname> 为空PHP 一样会扫描在编译时指定的
<option role="configure">--with-config-file-scan-dir</option> 此路径。
</para>
<para>
对于每个目录而言PHP 会以首字符顺序为优先级,扫描该目录下所有的 <literal>.ini</literal> 结尾的配置文件。所有被截入的配置文件,可以通过
<function>php_ini_scanned_files</function> 函数来获取列表,也可以通过 PHP 命令行加入
<option>--ini</option> 参数来查看。
</para>
<informalexample>
<screen>
<![CDATA[
以下假设 PHP 配置为 --with-config-file-scan-dir=/etc/php.d
并且目录分隔符为 :
$ php
PHP 会加载 /etc/php.d/*.ini 全部配置文件。
$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
PHP 会加载 /usr/local/etc/php.d/*.ini 全部配置文件。
$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
PHP 会加载 /etc/php.d/*.ini 下的全部配置文件,然后加载
/usr/local/etc/php.d/*.ini 下的全部配置文件。
$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
PHP 会加载 /usr/local/etc/php.d/*.ini 下的全部配置文件,然后加载
/etc/php.d/*.ini 下的全部配置文件。
]]>
</screen>
</informalexample>
</sect2>
</sect1>
<sect1 xml:id="configuration.file.per-user">
<title>.user.ini 文件</title>
<simpara>
PHP 支持基于每个目录的 INI 文件配置。此类文件
<emphasis></emphasis>被 CGIFastCGI SAPI 处理。此功能使得 PECL 的 htscanner
扩展作废。如果你的 PHP 以模块化运行在 Apache 里,则用 &htaccess; 文件有同样效果。
</simpara>
<simpara>
除了主 &php.ini; 之外PHP 还会在每个目录下扫描 INI
文件,从被执行的 PHP 文件所在目录开始一直上升到 web
根目录(<varname>$_SERVER['DOCUMENT_ROOT']</varname>
所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
</simpara>
<simpara>
在 .user.ini 风格的 INI 文件中只有具有 <constant>INI_PERDIR</constant>
<constant>INI_USER</constant> 模式的 INI
设置可被识别。
</simpara>
<simpara>
两个新的 INI 指令,
<link linkend="ini.user-ini.filename">user_ini.filename</link>
<link linkend="ini.user-ini.cache-ttl">user_ini.cache_ttl</link>
控制着用户 INI 文件的使用。
</simpara>
<simpara>
<link linkend="ini.user-ini.filename">user_ini.filename</link> 设定了 PHP
会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP
不会搜寻。默认值是 <literal>.user.ini</literal>
</simpara>
<simpara>
<link linkend="ini.user-ini.cache-ttl">user_ini.cache_ttl</link> 控制着重新读取用户
INI 文件的间隔时间。默认是 300 秒5 分钟)。
</simpara>
</sect1>
<sect1 xml:id="configuration.changes.modes">
<title>配置可被设定范围</title>
<para>
这些模式决定着一个 PHP
的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在
PHP 脚本中用 <function>ini_set</function> 来设定,而有些则只能在
&php.ini;&httpd.conf; 中。
</para>
<para>
例如
<link linkend="ini.output-buffering">output_buffering</link>
指令是属于
<constant>INI_PERDIR</constant>,因而就不能用
<function>ini_set</function> 来设定。但是
<link linkend="ini.display-errors">display_errors</link>
指令是属于
<constant>INI_ALL</constant> 因而就可以在任何地方被设定,包括
<function>ini_set</function>
</para>
<para>
<variablelist>
<!--
Replace everything inside the <variablelist> element with an <xi:include>
once libxml2 gets XInclude 1.1 attribute copying support.
The below <xi:include> will include the appropriate elements
but needs all top-level xml:id's removed (see XInclude 1.1 set-xml-id).
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('constant.ini-mode')/*)"><xi:fallback/></xi:include>
-->
<title>INI 模式常量</title>
<varlistentry>
<term>
<constant>INI_USER</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
可以在用户脚本(如使用 <function xmlns="http://docbook.org/ns/docbook">ini_set</function>)或 <link xmlns="http://docbook.org/ns/docbook" linkend="configuration.changes.windows">Windows
注册表</link>中设置条目。可以在 &user-ini; 中设置条目
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_PERDIR</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
可以在 &php.ini;&htaccess;&httpd.conf;&user-ini; 中设置条目
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_SYSTEM</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
可以在 &php.ini;&httpd.conf; 中设置条目
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_ALL</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
条目可以设置在任何地方
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1>
<sect1 xml:id="configuration.changes">
<title>怎样修改配置设定</title>
<sect2 xml:id="configuration.changes.apache">
<title>PHP 运行于 Apache 模块方式</title>
<simpara>
当使用 PHP 作为 Apache 模块时,也可以用 Apache
的配置文件(例如 &httpd.conf;)和 &htaccess;
文件中的指令来修改 PHP 的配置设定。需要有“AllowOverride
Options”或“AllowOverride All”权限才可以。
</simpara>
<para>
有几个 Apache 指令可以使用户在 Apache
配置文件内部修改 PHP 的配置。哪些指令属于
<constant>INI_ALL</constant><constant>INI_PERDIR</constant>
<constant>INI_SYSTEM</constant> 中的哪一个,请参考附录中的
<link linkend="ini.list">php.ini 配置选项列表</link>
</para>
<para>
<variablelist>
<varlistentry>
<term>
<systemitem role="directive">php_value</systemitem>
<parameter>name</parameter>
<parameter>value</parameter>
</term>
<listitem>
<para>
设定指定的值。只能用于
<constant>INI_ALL</constant><constant>INI_PERDIR</constant>
类型的指令。要清除先前设定的值,把 value 设为 <literal>none</literal>
</para>
<note>
<simpara>
不要用 <systemitem role="directive">php_value</systemitem> 设定布尔值。应该用
<systemitem role="directive">php_flag</systemitem>(见下面)。
</simpara>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_flag</systemitem>
<parameter>name</parameter>
<parameter>on|off</parameter>
</term>
<listitem>
<para>
用来设定布尔值的配置指令。仅能用于
<constant>INI_ALL</constant>
<constant>INI_PERDIR</constant> 类型的指令。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_admin_value</systemitem>
<parameter>name</parameter>
<parameter>value</parameter>
</term>
<listitem>
<para>
设定指定的指令的值。<emphasis>不能用于</emphasis> &htaccess;
文件。任何用 <systemitem role="directive">php_admin_value</systemitem>
设定的指令都不能被 &htaccess;
<function>ini_set</function> 覆盖。要清除先前设定的值,把 value 设为 <literal>none</literal>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_admin_flag</systemitem>
<parameter>name</parameter>
<parameter>on|off</parameter>
</term>
<listitem>
<para>
用来设定布尔值的配置指令。<emphasis>不能用于</emphasis> &htaccess;
文件。任何用 <systemitem role="directive">php_admin_flag</systemitem>
设定的指令都不能被 &htaccess;
<function>ini_set</function> 覆盖。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<example>
<title>Apache 配置例子</title>
<programlisting role="ini">
<![CDATA[
<IfModule mod_php5.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag engine on
</IfModule>
<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag engine on
</IfModule>
]]>
</programlisting>
</example>
</para>
<caution>
<para>
PHP 常量不存在于 PHP 之外。例如在
&httpd.conf; 中不能使用 PHP 常量如
<constant>E_ALL</constant><constant>E_NOTICE</constant> 来设定
<link linkend="ini.error-reporting">error_reporting</link>
指令,因为其无意义,实际等于
<emphasis>0</emphasis>。应该用相应的掩码值来替代。这些常量可以在
&php.ini; 中使用。
</para>
</caution>
</sect2>
<sect2 xml:id="configuration.changes.windows">
<title>通过 Windows 注册表修改 PHP 配置</title>
<simpara>
在 Windows 下运行 PHP 时,可以用 Windows
注册表以目录为单位来修改配置。配置值存放于注册表项
<literal>HKLM\SOFTWARE\PHP\Per Directory Values</literal>
下面,子项对应于路径名。例如对于目录
<literal>c:\inetpub\wwwroot</literal> 的配置值会存放于
<literal>HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot</literal>
项下面。其中的设定对于任何位于此目录及其任何子目录的脚本都有效。项中的值的名称是
PHP 配置指令的名字,值的数据是字符串格式的指令值。值中的 PHP
常量不被解析。不过只有可修改范围是 <constant>INI_USER</constant>
的配置值可以用此方法设定,<constant>INI_PERDIR</constant>
的值就不行。因为这些配置对于每次请求来说是只读的。
</simpara>
</sect2>
<sect2 xml:id="configuration.changes.other">
<title>其它接口下的 PHP</title>
<para>
无论怎样运行 PHP都可以在脚本中通过 <function>ini_set</function>
而在运行时修改某个值。更多信息见手册中
<function>ini_set</function> 的页面。
</para>
<para>
如果对自己系统中的配置设定及其当前值的完整列表感兴趣,可以运行
<function>phpinfo</function> 函数并查看其结果的页面。也可以在运行时用
<function>ini_get</function>
<function>get_cfg_var</function> 取得个别配置指令的值。
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->