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_valuephp_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 中禁用 PHP 错误报告?

上传带有 codeigniter、mime 类型错误的 xls 或 xlsx 文件

如何关闭 mysql 错误在 CodeIgniter 中显示到屏幕

codeigniter oracle 获取 insert_id()

将查询输出到 csv、codeigniter

Apache:网址中的 %25(400 错误请求)