【问题标题】:Is there a way to see which php.ini values have non-default settings?有没有办法查看哪些 php.ini 值具有非默认设置?
【发布时间】:2018-08-29 18:55:12
【问题描述】:

我不得不在旧的 PHP 5 服务器上做一些考古工作。我一直在挖掘 ini 文件,我发现检查哪些设置具有非默认值会非常方便。我发现了php --iniphp -r 'php_info();' 和其他变体,以及ini_get_all() function,它们可以显示在php ini 文件中设置的值和任何覆盖的值(例如来自.htaccessini_set)。

php.net 文档描述了默认设置for every ini directive。有没有办法从 PHP 代码中访问这些默认值?这样我就可以对ini_get_all 的返回值进行一些简单的数组操作,并找出哪些具有非默认值。

我正在查看ini_restore,给出的示例读起来好像它只恢复到启动值,即在 ini 文件中配置的值,而不是 php 默认值。

【问题讨论】:

  • 您可以重新下载有问题的 PHP 版本,并对新文件与当前使用的文件进行比较。请注意,在某些时候 PHP 开始提供 ini 文件的开发和生产版本,因此请在当前 ini 中寻找线索,看看它是否显示“开发”或其他内容。
  • 此外,您可以将当前的 ini 文件重命名为 php.ini 以外的其他名称并重新启动 PHP,以便 ini_get_all 将为您提供嵌入核心的值并在您的上使用 parse_ini_file()重命名文件。
  • 这个想法很愚蠢...如果您要使用输出黄油捕获 php_info,那么您可以使用 simplexml 找到具有值/默认值的表并对其进行解析。

标签: php configuration ini php-ini


【解决方案1】:

此外,您可以将当前的 ini 文件重命名为 php.ini 以外的文件并重新启动 PHP,以便 ini_get_all 将为您提供嵌入核心的值并在重命名的文件上使用 parse_ini_file()。 – MonkeyZeus

这很有魅力!在开始之前,我有一个链接的conf.d,并且我已经覆盖了cli/php.ini 文件以指向apache2/php.ini 文件,以便我的php cli 调用将使用Web 服务器配置。 cli/php.ini 文件已重命名为 .old,如下所示:

$ ls -l /etc/php5/cli/
total 68
lrwxrwxrwx 1 root root     9 Apr 24  2013 conf.d -> ../conf.d
lrwxrwxrwx 1 root root    25 Mar 13 05:04 php.ini -> /etc/php5/apache2/php.ini
-rw-r--r-- 1 root root 67629 Mar  4  2013 php.ini.old

我将 Web 服务器从负载平衡器池中取出并进行了一些修改。

$ rm /etc/php5/cli/conf.d /etc/php5/cli/php.ini
$ php --ini
Configuration File (php.ini) Path: /etc/php5/cli
Loaded Configuration File:         (none)
Scan for additional .ini files in: /etc/php5/cli/conf.d
Additional .ini files parsed:      (none)

然后我添加了一个名为 check_config.php 的文件,其中包含以下内容:

echo("\nDefaults that are changed by or not present in ini file $path:\n");
print_r(array_diff_assoc($defaults, $ini));

echo("\nValues set by $path which differ from or are not included in the defaults:\n");
print_r(array_diff_assoc($ini, $defaults));

得到了一些美味的输出。

$ /usr/bin/php /etc/php5/cli/check_config.php 

Defaults that are changed by or not present in ini file /etc/php5/apache2/php.ini:
Array
(
    [allow_call_time_pass_reference] => 1
    [allow_url_include] => 0
    //...snip
)

Values set by /etc/php5/apache2/php.ini which differ from or are not included in the defaults:
Array
(
    [engine] => 1
    [asp_tags] => 
    //...snip
)

这符合我的要求,但它有很多红鲱鱼 - 很多指令有一个默认值,但不包含在 ini 文件中,同样,很多特定于模块的指令不在返回的值中ini_get_all()。我想我可以通过进一步完善配置设置以启用更多模块来改进这一点,这些模块应该将它们的指令包含在列表中,但是有相当多的模块,所以我认为我现在很好。

【讨论】:

  • 我发现它的一个主要缺点是parse_ini_file()Off、null、falseno 的值返回空字符串,与实际为空的值无法区分字符串。这似乎已在 PHP 5.6.1 中使用 INI_SCANNER_TYPED 值修复,但可惜此 Web 服务器使用的是旧版本。
猜你喜欢
  • 2017-03-31
  • 2015-10-19
  • 2016-07-16
  • 1970-01-01
  • 2018-07-23
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多