.user.ini文件在子目录中是否有效?

9

.user.ini文件用于控制特定文件夹的PHP设置,它是否会影响子文件夹呢?

我看了一些网站,他们认为它可以影响子文件夹(尽管没有很多相关信息),但是我发现如果我从子文件夹运行一个脚本,它并不使用.user.ini文件中的设置。

我是不是漏了什么,或者它只能用于执行脚本的同一文件夹?如果是这样,有没有办法让php脚本从父文件夹等地方查找.user.ini文件呢?

2个回答

15

是的,它应该可以工作。然而,我遇到了与 .user.ini 文件不递归设置 php_value 的相同问题。根据 php.net 上的官方(并且简短)文档,它们应该递归工作(就像 .htaccess 一样):

PHP 在每个目录中扫描 INI 文件,从请求的 PHP 文件所在的目录开始, 并向上工作直到当前文档根目录(如 $_SERVER['DOCUMENT_ROOT'] 中设置)。 如果 PHP 文件在文档根目录之外,则只扫描其目录。

我发现 Apache 配置有一个多余的尾部斜杠导致 .user.ini 文件不能递归工作。

查看你的 phpinfo(),具体来说是 SCRIPT_FILENAME 变量。注意两个斜杠 - 应该只有一个:

$_SERVER['SCRIPT_FILENAME'] = //home/site/public_html/phpnfo.php

这个问题的原因是来自于 Apache 的配置文件中有一个多余的斜杠。

<IfModule !mod_php5.c>
    <FilesMatch \.php$>
            SetHandler "proxy:unix:/var/lib/php/php-fpm.sockets/site.sock|fcgi://localhost/"
    </FilesMatch>
    DirectoryIndex index.php index.html index.htm
</IfModule>

Apache配置在目录路径后面不包含斜杠,因此应该将fcgi://localhost/修改为fcgi://localhost,如下所示:

<IfModule !mod_php5.c>
    <FilesMatch \.php$>
            SetHandler "proxy:unix:/var/lib/php/php-fpm.sockets/site.sock|fcgi://localhost"
    </FilesMatch>
    DirectoryIndex index.php index.html index.htm
</IfModule>

更改后,请重新启动Apache / php-fpm,然后您就完成了。

更新:事实证明,在Apache配置中,尾随斜杠错误仍然很常见,可能会导致不同的错误和糟糕的php实践(例如设置在DocumentRoot /var/www/web/中)。


1
你刚刚帮我免去了一个大麻烦。我已经为这个问题烦恼了半年! - mishamosher
很高兴能帮助到您 :) - seven
1
你真是个英雄!没注意到那个斜杠,现在它可以工作了! - Davey Hoogland
因某种原因(我不知道),这个问题存在于Windows PHP上,但在PHP 7.3.19中已经解决了。https://bugs.php.net/bug.php?id=69436谢谢。 - vee

-2

我建议不要只看“少数网站”,而是阅读PHP手册:

自从PHP 5.3.0版本以来,PHP支持按目录基础的.htaccess风格的INI文件。 这些文件仅由CGI / FastCGI SAPI处理。此功能使PECL htscanner扩展过时。如果您使用Apache,请使用.htaccess文件实现相同的效果。

除了主php.ini文件外,PHP还会在每个目录中扫描INI文件,从请求的PHP文件所在的目录开始,并向上工作,直到当前文档根目录(如$_SERVER ['DOCUMENT_ROOT']中设置)。如果PHP文件在文档根目录之外,则仅扫描其目录。

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


那个功能好像不起作用了。只有在脚本当前目录存在.user.ini文件时,它才会被捕获。这是使用IIS虚拟目录的情况。如果安装在Apache上可能会有所不同? - Lock
如果您正在使用Apache,请使用.htaccess文件来实现相同的效果。 - Marcin Orlowski
如果我不使用Apache呢?最终我使用了主要的php.ini文件,并使用[PATH=xxx]来设置配置,这样就可以传播到子目录中。 - Lock
对我来说,它只能在文件夹的最大深度为2级时工作。http://stackoverflow.com/questions/41628499/user-ini-file-only-works-2-level-of-folder http://localhost/test/lv2 可以工作,但 http://localhost/test/lv2/lv3 无法工作。 - vee

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