【问题标题】:Does the .user.ini file work for subdirectories?.user.ini 文件是否适用于子目录?
【发布时间】:2015-01-29 07:41:28
【问题描述】:

控制文件夹特定 PHP 设置的 .user.ini 文件是否也下降到子文件夹中?

我正在阅读一些网站,他们建议这样做(尽管没有很多关于它的信息),但是我发现如果我从子文件夹运行脚本,它不会使用来自的设置.user.ini 文件。

我是否遗漏了某些内容,或者它仅适用于执行脚本的同一文件夹?如果是这样,有没有办法让 php 脚本从父文件夹等中查找 .user.ini 文件?

【问题讨论】:

    标签: php php-5.3


    【解决方案1】:

    是的,它应该可以工作。但是,我对 .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/ 中)。

    【讨论】:

    • 你让我免于如此头痛。这个问题我排了半年!
    • 很高兴我能帮上忙 :)
    • 你是英雄!没有抓住那个斜线,它现在可以工作了!
    【解决方案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上可能会不一样?
    • "如果您使用的是 Apache,请使用 .htaccess 文件以获得相同的效果。"
    • ...如果我不使用 Apache?我最终使用了主php.ini 并使用[PATH=xxx] 来设置已传播到子目录的配置。
    • 对我来说,它只适用于文件夹的最大 2 级深度。 stackoverflow.com/questions/41628499/… localhost/test/lv2 有效,但 localhost/test/lv2/lv3 无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2012-07-06
    相关资源
    最近更新 更多