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

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

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

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

【问题讨论】:

    标签: php .htaccess error-reporting


    【解决方案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 是如何获取它的值的呢?
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2010-09-14
    • 2013-07-06
    • 1970-01-01
    • 2020-10-12
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多