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

AJ *_*haw 3 php osx-server

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

我想在每个目录的基础上设置一些php.ini样式指令.根据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
Run Code Online (Sandbox Code Playgroud)

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

display_errors = On
Run Code Online (Sandbox Code Playgroud)

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

php_flag display_errors on
Run Code Online (Sandbox Code Playgroud)

我能找到的一个线索是主php.ini文件开头的神秘[PHP].我在手册中找不到任何关于此节标记的提及,所以我想也许有必要用[PHP]启动文件.我尝试将其添加到我的.user.ini文件的开头,并重新加载我的页面,再等待五分钟,再次重新加载,以确保我没有加载缓存版本,不幸的是它没有任何区别.

我发现的另一个线索是上述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文件加载的问题.有人知道答案吗?

为了完整性,我包括我的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'' --with-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'

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

AJ *_*haw 14

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

如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文件设置每目录配置指令,或者切换到公共网关接口.