如何在 PHP 中正确使用 .user.ini 文件?

Posted

技术标签:

【中文标题】如何在 PHP 中正确使用 .user.ini 文件?【英文标题】:How to correctly use `.user.ini`-file in PHP? 【发布时间】:2015-11-17 16:35:24 【问题描述】:

在我的工作目录中,我有两个文件:index.php.user.ini

.user.ini:

display_errors=on

; http://be2.php.net/manual/en/filter.configuration.php#ini.filter.default
;filter.default = "full_special_chars"

index.php:

<?php
//ini_set("display_errors", "on");

// Use `.user.ini` file:
// http://php.net/manual/en/configuration.file.per-user.php
echo "Setting for 'user_ini.filename': " . ini_get("user_ini.filename");
echo "\n\n";


// It takes up to five minutes, until `.user.ini` is re-read:
echo "Setting for 'user_ini.cache_ttl': " . ini_get("user_ini.cache_ttl");
echo "\n\n";

// http://php.net/manual/en/function.ini-get.php
echo "Setting for 'display_errors': " . ini_get("display_errors");
echo "\n\n";
echo "Setting for 'filter.default': " . ini_get("filter.default");
echo "\n\n";

// php -S localhost:8000
// http://localhost:8000/

使用上面的.user.ini-文件(在我的工作目录中),我希望"Setting for 'display_errors': " 的值为on1,但它是空的。

如何使用.user.ini-文件正确更改设置?

运行 php --ini 导致

Configuration File (php.ini) Path: /etc/php5/cli
Loaded Configuration File:         /etc/php5/cli/php.ini
Scan for additional .ini files in: /etc/php5/cli/conf.d
Additional .ini files parsed:      /etc/php5/cli/conf.d/05-opcache.ini,
/etc/php5/cli/conf.d/10-pdo.ini,
/etc/php5/cli/conf.d/20-json.ini,
/etc/php5/cli/conf.d/20-readline.ini

其中不包含我的.user.ini-文件。

显式添加.user.ini-file 有效:

php --php-ini .user.ini index.php

但我希望在从给定文件夹运行脚本时自动读取它。

【问题讨论】:

【参考方案1】:

在documentation 中写道:

这些文件仅由 CGI/FastCGI SAPI 处理

如果您使用的是 Apache,请使用 .htaccess 文件以获得相同的效果。

因此,如果您将 PHP 作为 Apache 模块、从命令行或使用内置服务器运行,则不会处理 .user.ini 文件。

要找出您的服务器 API,只需生成一个包含以下内容的 PHP 脚本并在您的网络浏览器中调用它:

<? phpinfo();

【讨论】:

是否有返回服务器 API 的 PHP 函数? @Edward 你可以使用php_sapi_name() @CMCDragonkai 是的,但前提是您的本地服务器配置为 FastCGI 模块。你可以通过检查 phpinfo(); 来识别它。在行中Server API @Arxeiss 我的测试表明它不适用于php -S 在尝试将 .user.ini 与 php -S 一起使用时,不知何故我浏览了文档并多次错过了这一点。谢谢你让我明白了。此外,我发现它也不使用 /etc/php-cli.ini。检查php_sapi_name()后,我成功使用/etc/php-cli-server.ini【参考方案2】:

根据http://php.net/manual/en/configuration.file.per-user.php

检查user_ini.filename 在您的主要php.ini 中以确保它不是空白并且确实已被解析。如果它的值为空,那么 PHP 根本不会扫描。

另见user_ini.cache_ttl的值

请看一下

php.net manual

也检查一下这个问题 Loading a .user.ini PHP conf file using the PHP 5.4 internal server?

【讨论】:

index.php 已经做到了。输出为:Setting for 'user_ini.filename': .user.iniSetting for 'user_ini.cache_ttl': 300。所以至少在五分钟后,index.php 应该返回正确的设置 - 但它们不是,...【参考方案3】:

您可以创建 .user.ini 文件并放置设置(没有任何缩进或空格),而不是使用 .htaccess 进行 php 配置。例如我的 .user.ini 配置是:

max_execution_time =600
upload_max_filesize=200M
post_max_size=200M
memory_limit=256M 

【讨论】:

以上是关于如何在 PHP 中正确使用 .user.ini 文件?的主要内容,如果未能解决你的问题,请参考以下文章

php配置可修改范围:PHP_INI_USER,PHP_INI_PERDIR,PHP_INI_SYSTEM,PHP_INI_ALL

[SUCTF 2019]CheckIn(user.ini文件构成的php后门)

user.ini可能引起PHP网站无法正常访问

.htaccess 和 .user.ini

.htaccess 和 .user.ini

记录:.user.ini 使用