在 .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 作为示例,尽管我也想了解它是如何工作的。 我仍然好奇的问题是:如果我们在.htaccess
或php.ini
中打错字,会发生什么情况?如果它在.htaccess
中,它会从php.ini
中获取值吗?如果php.ini
中有错字,那怎么办?我尝试过试验,但值仅在Local Value
中发生了变化。那么php.ini
是如何获取它的值的呢?以上是关于在 .htaccess 中设置 php_value 时出现意外错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AllowOverride 指令来允许 .htaccess 文件覆盖 php_value (Apache2)