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

时间:2012-06-10 01:37:58

标签: php osx-server

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

我想在每个目录的基础上设置一些php.ini样式指令。根据PHP manual page,自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 manual page中同样神秘的声明,描述了如何使用.user.ini文件:“这些文件仅由CGI / FastCGI SAPI处理。”不幸的是我不知道如何确认除了我的phpinfo()输出中的行之外还满足这个条件:“GATEWAY_INTERFACE CGI / 1.1”因为我的phpinfo中几乎没有其他字符串“cgi”的实例( )输出。我不得不假设这个神秘的陈述并不重要,只是说CGI / FastCGI SAPI进行处理(无论那意味着什么),而不是警告我需要打开一些东西。如果我错了,请纠正我。

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

为了完整性,我包括我的configure命令,以防有人可以看到一些明显的问题,虽然我认为我没有从默认情况下更改它:

  

'/ private / var / tmp / apache_mod_php / apache_mod_php-53.8~2 / php / configure'' - prefix = / usr'' - mandir = / usr / share / man'' - infodir = / usr / share / info''--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' '--enable-sysvmsg' '--enable-sysvsem'' - enable-sysvshm'' - enable-wddx'' - with-xmlrpc'' - with-iconv-dir = / usr'' - with-xsl = / usr' '--enable-zend-multibyte'' - enable-zip'' - with-pcre-regex = / usr'

(亲爱的读者,您已经阅读了这篇文章,如果您确实看到上述配置中有些不相关的内容,请随时在此原始帖子的评论中提及)

2 个答案:

答案 0 :(得分:14)

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

正如PHP文档的General Installation Considerations部分所述,PHP可以通过以下两种方式之一与Apache服务器一起运行:

  1. 直接在Apache中作为Apache模块(mod_php)也称为SAPI(服务器应用程序编程接口),或
  2. 作为通过CGI(通用网关接口)或FastCGI协议与Apache通信的单独可执行文件。
  3. 当PHP作为Apache中的模块运行时(Mac OS X Server上的默认设置),PHP无法直接访问文件系统,而Apache提供了PHP完成工作所需的一切。这意味着从文件系统中获取最后一分钟的每目录配置选项不是一种选择。这意味着Apache需要负责将任何每个目录设置交给PHP处理器,因此必须通过.htaccess(Apache处理并传递给PHP)来设置

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

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

答案 1 :(得分:0)

根据手册进一步说明:

  

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

另外,您是通过Apache在CGI或FastCGI模式下运行PHP吗?