如何让 PHP 5.3.8 读取 .user.ini 文件?

2024-01-10

我有一台运行 Apache 2.2.21 和 PHP 5.3.8 的 Mac OS X 服务器

我想在每个目录的基础上设置一些 php.ini 样式指令。根据PHP手册页 http://www.php.net/manual/en/configuration.file.per-user.php,从 PHP 5.3.0 开始,可以通过在包含您想要受影响的脚本的目录中放置一个名为“.users.ini”的文件来覆盖每个目录中主 php.ini 运行时配置文件中的指令。

对我来说,这个解决方案比使用 .htaccess 文件中包含的 php_value 和 php_flag 指令更可取,但是我创建的 .user.ini 文件被 PHP 忽略。

根据 phpinfo(),我的 .user.ini 文件应该每 5 分钟重新缓存一次,并且文件名正确设置为“.user.ini”:

user_ini.cache_ttl   300
user_ini.filename    .user.ini

Apache 设置为AllowOverides,并且我已经确认通过 .htaccess 文件设置 PHP 指令正确地覆盖了我想要控制的 ini 设置。我尝试过的最简单的测试文件是 .user.ini 文件,仅包含以下行:

display_errors = On

这不起作用,并且使用系统范围的目录(=Off)。但是,等效的 .htaccess 文件按预期工作,覆盖系统范围指令:

php_flag display_errors on

我能找到的一条线索是主 php.ini 文件开头的神秘 [PHP]。我在手册中找不到任何提及此部分标记的内容,因此我认为也许有必要以 [PHP] 开头该文件。我尝试将其添加到我的 .user.ini 文件的开头,然后重新加载我的页面,又等了五分钟,再次重新加载,以确保我没有加载缓存版本,不幸的是它没有任何区别。

我发现的另一个线索是前面提到的 PHP 中同样神秘的语句手册页 http://nz.php.net/manual/en/configuration.file.per-user.php描述如何使用 .user.ini 文件:“这些文件仅由 CGI/FastCGI SAPI 处理。”不幸的是,我不知道如何确认这个条件是否得到满足,除了我的 phpinfo() 输出中的行:“GATEWAY_INTERFACE CGI/1.1”,因为我的 phpinfo() 中几乎没有字符串“cgi”的其他实例( ) 输出。我只能假设这个神秘的陈述并不重要,只是说明 CGI/FastCGI SAPI 进行处理(无论这意味着什么),而不是警告我需要打开某些东西。如我错了请纠正我。

在同一 .user.ini 手册页的注释中还提到,使用 php-fpm 时,.user.ini 文件的处理将不起作用。据我所知,我没有使用它,但如果有一个简单的方法来检查,请告诉我。这确实引发了一个问题:是否存在其他配置选项或模块与该功能冲突并禁用 .user.ini 文件的加载。有人知道答案吗?

为了完整起见,我包含了我的配置命令,以防有人看到一些明显的问题,尽管我认为我没有更改默认值:

'/private/var/tmp/apache_mod_php/apache_mod_php-53.8~2/php/configure' '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/信息''--disable-dependency-tracking'''--sysconfdir=/private/etc'''--with-apxs2=/usr/sbin/apxs'''--enable-cli'''--with-config-file -path=/etc' '--with-libxml-dir=/usr' '--with-openssl=/usr' '--with-kerberos=/usr' '--with-zlib=/usr' '- -enable-bcmath' '--with-bz2=/usr' '--enable-calendar' '--with-curl=/usr' '--enable-exif' '--enable-ftp' '--with -gd''--with-jpeg-dir=/BinaryCache/apache_mod_php/apache_mod_php-53.8~2/Root/usr/local''--with-png-dir=/BinaryCache/apache_mod_php/apache_mod_php-53.8~2/Root /usr/local' '--enable-gd-native-ttf' '--with-ldap=/usr' '--with-ldap-sasl=/usr' '--enable-mbstring' '--enable- mbregex''--with-mysql=mysqlnd''--with-mysqli=mysqlnd''--with-pdo-mysql=mysqlnd''--with-mysql-sock=/var/mysql/mysql.sock'' --without-pear' '--with-iodbc=/usr' '--enable-shmop' '--with-snmp=/usr' '--enable-soap' '--enable-sockets' '--启用 sysvmsg' '--启用 sysvsem' '--启用 sysvshm' '--启用 wddx' '--with-xmlrpc' '--with-iconv-dir=/usr' '--with-xsl =/usr' '--enable-zend-multibyte' '--enable-zip' '--with-pcre-regex=/usr'

(亲爱的读者,既然您已经读到这里,如果您确实发现上述配置有一些不相关的奇怪之处,请随时在原始帖子附带的评论中提及)


从其他成员的评论中收集了一些线索,我已经能够做足够的研究来正确回答这个问题,以供将来参考。

正如中所解释的一般安装注意事项 http://www.php.net/manual/en/install.general.php根据 PHP 文档部分,PHP 可以通过以下两种方式之一与 Apache 服务器一起运行:

  1. 直接在 Apache 中作为 Apache 模块 (mod_php) 也称为 SAPI(服务器应用程序编程接口),或者
  2. 作为一个单独的可执行文件通过 CGI(通用网关接口)或 FastCGI 协议与 Apache 进行通信。

当 PHP 在 Apache(Mac OS X Server 上的默认设置)中作为模块运行时,PHP 无法直接访问文件系统,并且 Apache 提供 PHP 完成其工作所需的一切。这意味着从文件系统中获取最后一刻的每个目录配置选项不是一种选择。这意味着 Apache 需要负责将任何每个目录设置传递给 PHP 处理器,因此必须通过 .htaccess (Apache 处理并传递给 PHP)进行设置

当 PHP 作为它自己的进程运行时(通过 CGI 或 FastCGI 与 Apache 通信),PHP 处理器能够在开始处理脚本之前直接访问目录结构,因此可以在每个进程上加载额外的配置文件。目录基础,这会影响诸如解析错误的显示之类的事情(不可能在脚本运行时决定,因为如果脚本不解析,PHP 就无法遵循其中的任何指令)。

所以简短的版本是,如果 PHP 作为 Apache 模块运行,您需要通过 .htaccess 文件设置每个目录的配置指令,或者切换到通用网关接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 PHP 5.3.8 读取 .user.ini 文件? 的相关文章

随机推荐