如何在另一个php.ini文件中包含一个php.ini文件?

39

我该如何在一个php.ini文件中包含另一个php.ini文件?


2
我很感兴趣RHEL/Fedora是如何实现/etc/php.d/*的包含的。他们是否修补了PHP以使其成为可能? - gahooa
@gahooa 这就是我来这里的问题。你是否了解他们如何实现 /etc/php.d/* 的包含? - Jeff Puckett
1
请查看下面的被接受的答案,它也回答了你的问题。你也可以执行 php -i (phpinfo()) 命令来查看 PHP 是如何构建的。 - Itay Moav -Malimovka
7个回答

28

我不认为你可以从主php.ini文件中“包含” .ini 文件。

然而,一种可能的解决方案是,在编译PHP时在配置行上使用此选项:

--with-config-file-scan-dir=PATH
    Set the path where to scan for configuration files

如果在编译时使用此选项,PHP将会查找此目录中的每个.ini文件,除了“正常”的php.ini文件。
我猜这就是Ubuntu所使用的方式,例如,它为每个下载的扩展使用不同的.ini文件,而不是修改php.ini。
使用此选项可以定义php.ini文件的路径,在配置行上:
--with-config-file-path=PATH
    Set the path in which to look for php.ini [PREFIX/lib]

不过,这可能意味着您需要重新编译 PHP——其实并不难——最难的部分是获取所需的依赖项。

这里有一篇关于 internals@ 邮件列表的帖子,与我说的一样:配置文件和 PHP_CONFIG_FILE_SCAN_DIR


除了编译时设置外,还有一个环境变量 PHPRC,可以更改默认的 php.ini(以及可能的其他 ini 文件)目录。 - Emre Yazici
1
当你说“在配置行上”时,这是什么意思?那是某个文件吗? - tomjung
请注意,Debian 打包的 PHP 构建是配置为在启动时扫描特定于 Web 服务器的目录以获取其他配置文件的。目录中找到的任何 *.ini 文件都被视为 php.ini 的一部分。像 Ubuntu 这样的基于 Debian 的发行版也很可能这样做。示例目录:/etc/php/7.4/apache2/conf.d/ 参考文献:/usr/share/doc/php7.4-common/README.Debian.gz - Ben Scott

11

你也可以在~/.bashrc中定义路径。

export PHP_INI_SCAN_DIR=/usr/local/lib/php.d

1
它只能在CLI中工作,而不能在httpd中工作。 - Maciek Rek

9

我安装了php的Memcached,但不确定如何确保它的ini文件包含在我的php.ini文件中,实际上,它是自动包含的。您可以通过运行php --ini来验证正在加载什么。

php --ini
Configuration File (php.ini) Path: /opt/local/etc/php5
Loaded Configuration File:         (none)
Scan for additional .ini files in: /opt/local/var/db/php5
Additional .ini files parsed:      /opt/local/var/db/php5/memcached.ini

1
看起来“php --ini”返回的配置文件路径可能与网页(<?php phpinfo(); ?>)返回的不同。 - gonglong

6

编辑: 我的回答是错误的。这个方法只适用于.conf文件,这并不是问题所在。更好的测试表明,在php.ini文件中它不起作用,其中include语句被忽略。


我刚在Debian 9(Stretch)上使用PHP-FPM进行了测试。从某个.conf文件中,使用以下语法:

include=/path/to/special-php.ini

或者甚至

include=/path/to/special-dir-full-of-conf-files/*.conf

作为它在编程中的使用方式

/etc/php/7.0/fpm/php-fpm.conf
include=/etc/php/7.0/fpm/pool.d/*.conf

顺便提一下,如果你按主题或者想要一个用于开发和另一个用于生产的集合,那么这将非常有用。然后你可以像Debian/Apache风格一样进行操作。

/etc/php/conf-available/
/etc/php/conf-enabled/

从第二个到其他的符号链接,并包含其中一个。

2
对我来说,这在php-fpm.conf中有效,但在php.ini中无效。 - Thomas Rokicki
1
这不适用于 php.ini,这也是问题所在。 - Ben Scott

5

看起来您不能将一个ini文件包含到另一个文件中,以便被引用和加载。但是您可以设置php来通过告诉它要查找哪些文件夹来加载多个文件。

当使用FastCGI设置(可能也适用于FPM,尽管我不确定)时,您可以从PHP包装器内部导出环境变量。

在那里,您可以执行以下操作:

export PHP_INI_SCAN_DIR=/etc/php5/cgi/conf.d:/var/www/mydomain.net/etc

/var/www/mydomain.net/etc只是一个示例。这是你放置附加ini文件的文件夹。似乎这可以是一个:分隔的列表。

使用一个phpinfo.php(任意命名的文件,只包含<?php phpinfo();),在浏览器中打开相应的URL,并检查在其顶部区域中解析的目录列表和加载的文件列表。

/etc/php5/cgi/conf.d应始终包括(我猜这是因为它被编译到PHP可执行文件中),可能并不是真正需要的。


0

不行。请阅读以下在线页面:

配置文件

摘要:PHP 启动时会读取配置文件(php.ini)。对于 PHP 的服务器模块版本,这仅在 Web 服务器启动时发生一次。对于 CGI 和 CLI 版本,它会在每次调用时发生。

.user.ini 文件

摘要:除了主 php.ini 文件外,PHP 还会扫描每个目录中的 INI 文件,从请求的 PHP 文件所在的目录开始,并向上工作到当前文档根目录(如 $_SERVER['DOCUMENT_ROOT'] 中设置)。只有使用 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置才能在 .user.ini 样式的 INI 文件中被识别。


4
发帖前我已经阅读过这些内容,没有提到是否包括可行性。 - Itay Moav -Malimovka

-1
你可以尝试使用ini_set函数模拟它。但正如“手册”所指出的,不是所有的ini选项都可以使用ini_set进行更改。尽管如此,这绝对是一个有用的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接