【发布时间】:2015-01-29 07:41:28
【问题描述】:
控制文件夹特定 PHP 设置的 .user.ini 文件是否也下降到子文件夹中?
我正在阅读一些网站,他们建议这样做(尽管没有很多关于它的信息),但是我发现如果我从子文件夹运行脚本,它不会使用来自的设置.user.ini 文件。
我是否遗漏了某些内容,或者它仅适用于执行脚本的同一文件夹?如果是这样,有没有办法让 php 脚本从父文件夹等中查找 .user.ini 文件?
【问题讨论】:
控制文件夹特定 PHP 设置的 .user.ini 文件是否也下降到子文件夹中?
我正在阅读一些网站,他们建议这样做(尽管没有很多关于它的信息),但是我发现如果我从子文件夹运行脚本,它不会使用来自的设置.user.ini 文件。
我是否遗漏了某些内容,或者它仅适用于执行脚本的同一文件夹?如果是这样,有没有办法让 php 脚本从父文件夹等中查找 .user.ini 文件?
【问题讨论】:
是的,它应该可以工作。但是,我对 .user.ini 文件没有递归设置 php_value 有同样的问题。根据 php.net 上的官方(和简短)文档,它们应该递归地工作(就像 .htaccess 所做的那样):
PHP 扫描每个目录中的 INI 文件,从目录开始 请求的 PHP 文件,并一直工作到当前 文档根目录(在 $_SERVER['DOCUMENT_ROOT'] 中设置)。 如果 PHP 文件位于文档根目录之外,则仅扫描其目录。
我发现 Apache 配置的一个斜杠太多导致 .user.ini 文件无法递归工作。
看看你的 phpinfo(),特别是 SCRIPT_FILENAME 变量。注意两个斜杠 - where 应该只有一个:
$_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/ 中)。
【讨论】:
我建议阅读 PHP 手册,而不是阅读“少数网站”:
自 PHP 5.3.0 起,PHP 包含对 .htaccess 样式的 INI 文件的支持 每个目录的基础。 这些文件仅由 CGI/FastCGI SAPI。此功能淘汰了 PECL htscanner 延期。如果您使用的是 Apache,请使用相同的 .htaccess 文件 效果。
除了主 php.ini 文件外,PHP 还会扫描每个文件中的 INI 文件 目录,从请求的 PHP 文件的目录开始,以及 一直到当前文档根目录(如在 $_SERVER['DOCUMENT_ROOT'])。如果 PHP 文件不在 文档根目录,只扫描其目录。
【讨论】:
.user.ini 文件存在于脚本的当前目录中,它只会拾取它。这是在 IIS 中使用虚拟目录。安装在apache上可能会不一样?
php.ini 并使用[PATH=xxx] 来设置已传播到子目录的配置。