CodeIgniter 错误报告 1.7.x 和 2.x 之间的区别
Posted
技术标签:
【中文标题】CodeIgniter 错误报告 1.7.x 和 2.x 之间的区别【英文标题】:CodeIgniter Error Reporting Difference between 1.7.x and 2.x 【发布时间】:2013-10-01 21:06:33 【问题描述】:我有两台相同的 Debian Squeeze 服务器,运行 php 5.3.3-7+squeeze17,一台运行 1.7.x,另一台运行 2.1.4。
在1.7安装时,当我调用一个调用未定义模型方法的控制器方法时,页面输出:
Fatal error: Call to undefined method Example_Model::get_series_and_products() in /opt/git/online_live/application/controllers/members.php on line 2549
但是,在 2.1.4 上根本没有输出。 echo
语句在未定义函数输出文本之前插入,但之后的语句没有。
两个站点的 VirtualHost 配置中的 php error_reporting 设置为 -1,这似乎覆盖了 config.php 定义的开发环境设置,将 error_reporting 设置为 E_ALL。
这是我用于输出的一些额外代码:
echo ini_get('error_reporting');
echo '<br>';
echo phpversion();
两者输出相同:
-1
5.3.3-7+squeeze17
因此,似乎没有其他任何事情胜过我的 error_reporting。
在 2.1.4 的 application/config/config.php 中(没有显示错误):
$config['log_threshold'] = 4; // All Messages
在 1.7 中(显示错误的地方):
$config['log_threshold'] = 0;
但我认为该设置是针对 CI 保留的文件系统日志而不是内联错误。
phpInfo() 在两台主机上反映相同的 error_log 值:
error_log: no value no value
error_reporting: -1 22527
什么可能导致差异?
【问题讨论】:
两种 CI 设置的日志级别是多少? (application/config/config.php for 2.1.X) 当您比较phpinfo()
时,您是否看到相同的错误记录?最后很难说,因为我们没有太多信息可以继续。
我认为如果 ini_get('error_reporting') 报告 -1,那么 config.php 中的内容无关紧要,但我仍然在上面添加了 log_threshold 参数。是你说的参数吗?两者的 phpInfo() 产生相同的值: error_append_string:无值 error_log:无值 error_prepend_string:无值 error_reporting:-1
【参考方案1】:
编辑:如果您的设置是使用php_admin_value
或php_admin_flag
设置的,则此不适用。感谢 jaydisc 让我了解这个事实。答案在 display_error
指令中,该指令控制错误的显示。
但是,我将把帖子的其余部分留在这里,因为根据问题标题,如果不是 php_admin_value
设置,这将是一个可能的答案。
1.7.x 和 2.x 的错误报告区别
无论您的error_reporting
设置如何,Codeigniter 都会在index.php
中覆盖它。 http://php.net/manual/en/function.error-reporting.php
The error_reporting() function sets the error_reporting directive at runtime. PHP has many levels of errors, using this function sets that level for the duration (runtime) of your script.
这是因为error_reporting
属于ini_set
函数家族:http://php.net/manual/en/function.ini-set.php,它在脚本期间覆盖 php 指令,包括 php_admin_value。
对于 1.7.x,(在此处查看旧版本 http://ellislab.com/codeigniter/user-guide/installation/downloads.html),
index.php
的第一行代码是
error_reporting(E_ALL);
,无论如何都会导致错误(除非稍后通过代码更改设置)。
对于 2.1.4,(https://github.com/EllisLab/CodeIgniter/blob/2.1.4/index.php) 它取决于 ENVIRONMENT
常量:
/*
*---------------------------------------------------------------
* ERROR REPORTING
*---------------------------------------------------------------
*
* Different environments will require different levels of error reporting.
* By default development will show errors but testing and live will hide them.
*/
if (defined('ENVIRONMENT'))
switch (ENVIRONMENT)
case 'development':
error_reporting(E_ALL);
break;
case 'testing':
case 'production':
error_reporting(0);
break;
default:
exit('The application environment is not set correctly.');
【讨论】:
好吧,我在 VirtualHost 中使用 php_admin_value,所以我会礼貌地不同意,因为它会覆盖任何单个 php 文件的指令。但无论如何,错误不应该出现在 E_ALL 中吗? @jaydisc 我更新了我的答案以反映error_reporting()
覆盖任何服务器指令的事实。此外,如果您担心错误的显示,那么display_error
指令也很重要。你也应该检查你的设置。
很遗憾,php.net/manual/en/configuration.changes.php 不同意你的观点:Any directive type set with php_admin_value can **not** be overridden by .htaccess or ini_set().
。但是,您查看 display_error 的想法确实是正确的。一旦我使用 php_admin_flag 设置它,一切都很好。谢谢你。由于有关 php_admin_value 的错误信息,我有点害怕将您的答案标记为正确的答案。
@jaydisc 无意提供错误信息,我实际上不知道,感谢您的链接!我已经进一步更新了我的答案以反映这一点。以上是关于CodeIgniter 错误报告 1.7.x 和 2.x 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
上传带有 codeigniter、mime 类型错误的 xls 或 xlsx 文件
如何关闭 mysql 错误在 CodeIgniter 中显示到屏幕