在 .htaccess 中设置 php_value 时出现意外错误?

Posted

技术标签:

【中文标题】在 .htaccess 中设置 php_value 时出现意外错误?【英文标题】:Accidental error in setting php_value in .htaccess? 【发布时间】:2015-05-03 23:55:36 【问题描述】:

所以当我当前在 php 中查看 phpinfo() 时,我的 error_reporting 设置为某个数字,它表示所有错误常量值的总和,对吗? 假设我在 .htaccess 中不小心将 error_reporting 的值设置为一些奇怪的值:

    -1 大于 E_ALL 的值(例如 32768,如果我没记错的话) 使用字符串设置时,我打错了(**E_AL** & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED) - E_ALL 中的错字

会发生什么,它会被设置为某个默认值吗?还是来自 php.ini?我尝试设置上述所有值,它们都设置在Local Value 中,没有任何问题。 我很好奇任何其他值也会发生什么,它会默认为 php.ini 还是什么? 谢谢!

【问题讨论】:

【参考方案1】:

PHP 使用位运算符来确定是否应报告错误级别。所以无论您的整数值是二进制的,它都会按位 & 来查看是否报告了错误。

例如 如果 E_DEPRECATED 是(不是说这是准确的):01,E_WARNING 是 10,E_NOTICE 是 100,使用 E_DEPRECATED |电子警告 | E_NOTICE 将给出二进制 111,因此当报告错误时,如 E_WARNING,它将取设置的值,并按位 & 来确定是否显示报告:

111 & 010 = True,所以会报错。

如果你刚刚使用了 E_DEPRECATED | E_NOTICE,二进制是101,所以101 & 010 = False,所以不会报错。

这些二进制文件中的每一个都可以转换为 base10、01 = 1、10 = 2、100 = 4 等。

因此,如果您想知道随机整数会报告哪些错误,您可以这样做:

int & E_WARNING 在你的 PHP 解析器中,如果为 True 则显示错误,如果为 FALSE 则错误将被忽略。

这是一个很好的学习约定,因为它在实现应用程序日志记录时也非常有用,您可以使用相同的系统,因此您不必实现长开关或 if .. elseif .. 块根据配置决定是否记录日志级别。

  /**
   * Determines whether this message should be logged based on the provided type and the set threshold
   * @access protected
   * @param  int $type
   * @param  string   $name name of the log to check.
   * @return boolean
   */
  protected function should_log($type,$name='default') 
    return (bool) ($this->getConfig($name)->threshold & $type);
  

因此阈值将是您的配置中的二进制数(它使用常量来提高可读性)然后它会根据返回 True 或 False 的提供的日志类型按位 & 来确定是否按名称将消息记录到记录器 $name ...更加优化。

【讨论】:

非常感谢,我当前的错误设置和活动错误之间的按位 & 是有意义的,这有助于我更多地了解它是如何工作的。但是,我使用error_reporting more 作为示例,尽管我也想了解它是如何工作的。 我仍然好奇的问题是:如果我们在.htaccessphp.ini 中打错字,会发生什么情况?如果它在.htaccess 中,它会从php.ini 中获取值吗?如果php.ini 中有错字,那怎么办?我尝试过试验,但值仅在Local Value 中发生了变化。那么php.ini 是如何获取它的值的呢?

以上是关于在 .htaccess 中设置 php_value 时出现意外错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AllowOverride 指令来允许 .htaccess 文件覆盖 php_value (Apache2)

在htaccess中设置内存限制[关闭]

.htaccess php_value display_errors 设置因错误 500 而中断

在.htaccess中设置PHP内存限制

在htaccess中设置内容过期

如何在.htaccess文件中设置PHP最大执行时间和脚本内存限制