两个(几乎)相同的代码片段产生单独的结果

时间:2012-02-15 11:17:50

标签: php model-view-controller

我一直致力于一个小小的MVC项目来协助我的自学,我遇到了一个让我感到困惑的问题。我在这个MVC-ish系统中创建了一个博客部分,并从ACL中提取用户权限,没有任何问题。 我开始创建一个成员部分,一旦我添加了任何权限检查,我就会从Chrome中收到以下错误:

  

未收到任何数据   无法加载网页,因为服务器未发送任何数据。   以下是一些建议:   稍后重新载入此网页。   错误324(net :: ERR_EMPTY_RESPONSE):服务器关闭连接而不发送任何数据。

我觉得这很奇怪,所以我仔细检查了我的错误日志,没有显示任何内容。所以我决定将工作博客代码复制并粘贴到成员文件中,重新加载并得到完全相同的错误,这两个文件之间唯一的区别就是文件名和类名。 这是博客代码:

<?php
class blog extends frontController {
    public $model;
    public $user;

    public function __construct()
    {
        parent::__construct();

        $this->model = $this->autoload_model();
        $this->user  = $this->load_user();
        $this->user->getUserRoles();
    }

    public function index()
    {
        //Will only list the latest post ;)
        if(!$this->user->hasPermission('blog_access'))
        {
            $array = $this->model->list_posts();

            if(empty($array))
            {
                $this->variables(array(
                    'site_title' => 'View Blog Posts',
                    'post_title' => 'Sorry but there are no posts to display'
                ));
            } else {
                $this->variables(array(
                    'site_title' => 'View Blog Posts',
                    'list'       => $array[0],
                    'post_title' => $array[0]['entry_title'],
                    'link'       => str_replace(' ', '_',$array[0]['entry_title']),
                ));
            }
        } else {
            $this->variables(array(
                'site_title' => 'Error :: Design Develop Realize',
                'body'       => 'Sorry, but you do not have permission to access this',
            ));
        }

        $this->parse('blog/list', $this->toParse);
    }

这是成员文件:

<?php

class member extends frontController {
    public $model;
    public $user;

    public function __construct()
    {
        parent::__construct();

        $this->model = $this->autoload_model();
        $this->user  = $this->load_user();
        $this->user->getUserRoles();
    }

    public function index()
    {
        //Will only list the latest post ;)
        if(!$this->user->hasPermission('blog_access'))
        {
            //$array = $this->model->list_posts();

            if(empty($array))
            {
                $this->variables(array(
                    'site_title' => 'Design Develop Realize :: View Blog Posts',
                    'post_title' => 'Sorry but there are no posts to display'
                ));
            } else {
                $this->variables(array(
                    'site_title' => 'Design Develop Realize :: View Blog Posts',
                    'list'       => $array[0],
                    'post_title' => $array[0]['entry_title'],
                    'link'       => str_replace(' ', '_',$array[0]['entry_title']),
                ));
            }
        } else {
            $this->variables(array(
                'site_title' => 'Error :: Design Develop Realize',
                'body'       => 'Sorry, but you do not have permission to access this',
            ));
        }

        $this->parse('blog/list', $this->toParse);
    }

在成员类中,如果我注释掉$this->user = $this->load_user();,则错误消失! 仅供参考,这是函数:

protected function load_user()
{
    if(!$this->loader->loaded['acl'])
    {
        $this->loader->loadCore('acl');
    }

    return $this->loader->loaded['acl'];
}

任何帮助或建议都会受到赞赏,因为我很难过!

PS是的我确实有错误报告设置为涵盖所有内容而且它没有记录任何内容!

编辑:因为所有文件都通过index.php我在那里放置了错误报告:

<?php
error_reporting(E_ALL);
ini_set('date.timezone', "Europe/London");

require_once('system/library/loader.php');

$loader = new loader();
$loader->loadCore(array('frontController', 'routing'));

编辑2: loadCore()低于

public function loadCore($toLoad, $params = false)
{
    //important task first, check if it is more then 1 or not
    if(is_array($toLoad))
    {
        //more then one so lets go to the task!
        foreach($toLoad as $file)
        {
            if(file_exists('system/library/' . $file . '.php'))
            {
                require_once('system/library/' . $file . '.php');

                if($params)
                {
                    $this->loaded[$file] = new $file($params);
                } else {
                    $this->loaded[$file] = new $file;
                }
            } else {
                trigger_error("Core File $file does not exist");
            }
        }
    } else {
        //Phew, less work, it is only one!
        if(file_exists('system/library/' . $toLoad . '.php'))
        {
            require_once('system/library/' . $toLoad . '.php');

            if($params)
            {
                echo(__LINE__); exit;
                $this->loaded[$toLoad] = new $toLoad($params);
            } else {
                $this->loaded[$toLoad] = new $toLoad;
            }
        }
    }
}

更新:我修改了loadCore,这样如果是被调用的acl就会使用try ... catch()并且没有帮助,因为它不会显示同样的错误chrome和IE页面

更新2 :我已经与我的主人交谈了,似乎每次发生此错误时,apache会记录以下内容(不知道为什么我在日志副本中看不到它!)

  

[Wed Feb 22 08:07:11 2012] [错误] [客户93.97.245.13]提前结束   脚本标题:index.php

8 个答案:

答案 0 :(得分:2)

您已注释掉

// $ array = $ this-&gt; model-&gt; list_posts();

所以现在数组为null,你正在尝试使用

'list'=&gt; $阵列[0], 'post_title'=&gt; $阵列[0] [ 'ENTRY_TITLE'],

肯定会产生错误。

编辑: -

我看到你有

'body' => 'Sorry, but you do not have permission to access this' , )); }

这是第二个,这是一个语法错误。并生成一个输出。如果已启用,请在CI中压缩输出,这将导致此错误。

答案 1 :(得分:1)

我有兴趣了解loadCore函数中的内容。

你曾在任何地方使用error_log吗?这可能有助于阐明这个问题。

答案 2 :(得分:1)

您是否在不同的浏览器中测试了此页面?用Google搜索你的错误,它表明它可能是特定于铬的?

你发表评论loadCore('acl')的陈述很有意思,所以很明显我会从那里开始。您确定它是通过加载程序获取system / library / acl.php页面的吗? Aka,它在loadCore()的出口下方触发第2行? var_dump返回imo以确保你获得对象。

答案 3 :(得分:1)

“脚本标头过早结束”是内部服务器错误。这通常在脚本中断时发生,并且在发送错误消息之前不发送任何HTTP头。这可能有几个原因。

  • 一个可能是输出缓冲。可能是您正在使用的服务器默认缓冲输出。我建议您使用output_buffering [docs here] 上的output_buffering = off来关闭php.ini

  • 确保您也发送正确的HTTP标头

      

    print“Content-type:text / html \ n \ n”;

this link还有更多建议。 要详细了解此错误,请go here

希望有所帮助

答案 4 :(得分:0)

首先。服务器在发送任何数据之前断开连接时会产生此错误。 一些建议。

  • 您的代码已损坏并让应用程序崩溃
  • 您的错误记录应通过NOTICES
  • 进行增强
  • 编写测试以检查每个部分
  • 你应该启用并使用调试器(zend_debugger,xdebug)
  • 发布更多连接信息(例如wget -O --debug'url')

这个问题存在特殊的问题 http://www.google.pl/support/forum/p/Chrome/thread?tid=3aa7b40eb01a95c8&hl=en#fid_3aa7b40eb01a95c80004ae797939c267

答案 5 :(得分:0)

我建议检查标签前是否有空行。

您使用的是哪些文件名?是否有任何约定需要遵循以适应您可能正在使用的框架?

答案 6 :(得分:0)

我想知道这是服务器问题而不是代码问题?

This thread表明您看到的服务器错误(标头过早结束500)可能是Apache日志太满且需要轮换的结果。但它确实可以是任何东西 - 它似乎只是暗示脚本根本不向浏览器返回任何输出。

我要检查的另一件事是文件权限,以及loadCore方法中include_once和file_exists的功能,因为它看起来可能会导致可能在不抛出php错误的情况下停止脚本的问题。

答案 7 :(得分:0)

可能是字符/编码错误,用notepad ++打开两个文件,转到编码,然后选择转换为UTF-8,保存文件并再次测试。

祝你好运!