3

我有一台运行 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

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

display_errors = On

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

php_flag display_errors on

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

我发现的另一个线索是前面提到的 PHP手册页中描述如何使用 .user.ini 文件的同样神秘的陈述:“这些文件仅由 CGI/FastCGI SAPI 处理。” 不幸的是,除了我的 phpinfo() 输出中显示“GATEWAY_INTERFACE CGI/1.1”的行之外,我不知道如何确认此条件是否得到满足,因为在我的 phpinfo( ) 输出。我只能假设这个神秘的声明并不重要,只是说明 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/ 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'--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'--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'--enable-sysvshm' '--enable-wddx' '--with-xmlrpc' '--with-iconv-dir=/usr' '--with-xsl=/usr' '--enable-zend-multibyte ' '--enable-zip' '--with-pcre-regex=/usr'--enable-sysvshm' '--enable-wddx' '--with-xmlrpc' '--with-iconv-dir=/usr' '--with-xsl=/usr' '--enable-zend-multibyte ' '--enable-zip' '--with-pcre-regex=/usr'

(亲爱的读者,既然您已经阅读了这么多,如果您确实看到与上述配置无关的奇怪之处,请随时在此原始帖子的评论中提及)

4

2 回答 2

14

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

如 PHP 文档的一般安装注意事项部分所述,PHP 可以通过以下两种方式之一与 Apache 服务器一起运行:

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

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

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

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

于 2012-06-11T02:15:41.423 回答
0

根据手册再往下一点:

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

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

于 2012-06-10T01:59:10.160 回答