2012-02-15 2 views
0

Я работал над небольшим проектом MVC, чтобы помочь в самообучении, и я столкнулся с проблемой, которая полностью сбила меня с толку. Я создал раздел блога в этой системе MVC-ish и вытащил пользовательские разрешения из ACL без каких-либо проблем. я перешел на создание раздела члена, и как только я добавил разрешение проверку я получаю следующее сообщение об ошибке от Chrome:Два (почти) идентичных фрагмента кода производят отдельные результаты

Нет данных получены Невозможно загрузить веб-страницу, так как сервер не посылал данных. Вот несколько советов: Перезагрузить страницу позже. Ошибка 324 (сеть :: 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 да У меня есть отчет об ошибках, чтобы охватить все, и нет, он ничего не регистрирует!

EDIT: Поскольку все файлы проходят через 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')); 

EDIT 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; 
      } 
     } 
    } 
} 

Update: Я модифицировал loadCore так, чтобы, если бы он был вызван acl, он использовал бы try ... catch(), и это не помогло, так как не будет отображаться ошибка ju й тот же хром и IE страницы

Update 2: Я говорил с моим хозяином, и это, кажется, что каждый раз возникает эта ошибка, апач входит следующее (не знаю, почему я не могу видеть его в моей копии журналов!)

[ср 22 февраля 2012 8:07:11] [ошибка] [клиент 93.97.245.13] Неожиданный конец заголовков сценария: index.php

+2

Можете ли вы показать, как вы установили отчет об ошибках и где? На каких журналах вы смотрите? Потому что вещи вроде этого должны абсолютно оставить след где-то –

+0

Я обновил вопрос, чтобы показать Pekka –

+0

Можете ли вы попробовать поставить строку error_reporting прямо перед нарушившимся вызовом, чтобы исключить, что он настроен на «тихий» в другом месте? И можете ли вы указать, какие журналы вы смотрите? –

ответ

1

«Преждевременный конец заголовков сценариев» - это внутренние ошибки сервера. Обычно это происходит, когда скрипт прерывается и не отправляет HTTP-заголовки перед отправкой сообщений об ошибках. Это может быть несколько причин.

  • Возможно, что вы выбрали буферизацию. Может быть сервером, который вы используете для буферов вывода по умолчанию. Я предложу отключить output_buffering, используя output_buffering = off по телефону php.ini[docs here].

  • Убедитесь, что вы отправляете правильные заголовки HTTP также

    печати "Content-тип: текст/html \ п \ п";

Есть еще несколько предложения о this link. Чтобы узнать больше об этой ошибке, go here.

Надеется, что это помогает

+0

Он не зафиксировал его полностью, но решил еще одну проблему, о которой я не знал, так что спасибо –

+0

@MarcTowler, рад, я мог бы немного помочь ... – Starx

1

Я был бы заинтересован в том, что находится внутри функции loadCore.

Вы использовали error_log в любом месте? Это может помочь пролить свет на проблему.

+0

Я обновил код и не использовал havent error_log –

+0

Спасибо! Я вижу «эхо» (__ LINE__); exit; 'в loadCore. Часть вашего тестирования? – snoj

+0

Это сейчас да, и мы надеемся помочь –

1

Вы проверяли эту страницу в разных браузерах? Исправлена ​​ошибка с вашей ошибкой, и это указывает на то, что это может быть хром конкретным?

Ваше заявление о том, что комментирование loadCore ('acl') является интересным, так что, очевидно, я бы начал там. Вы уверены, что он получает страницу system/library/acl.php через загрузчик? Ака, он запускает строку 2 ниже выхода в loadCore()? var_dump return imo, чтобы убедиться, что вы получаете объект.

+0

Да, как указано, я пробовал разные браузеры, у меня есть var_dumped и он правильно извлекает файл, он работает в одном php-файле, но не в другом –

2

Вы закомментирована

// $ = массив $ this-> модели-> list_posts();

Так что теперь массив является пустым, и вы пытаетесь использовать

'список' => $ массив [0], 'post_title' => $ массив [0] [ 'ENTRY_TITLE'],

который определенно вызовет ошибку.

EDIT: -

Я вижу, у вас есть

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

То есть во втором еще, что является синтаксической ошибкой. и генерирует выход. Если вы включили, сжимаете вывод в CI, что приведет к этой ошибке.

+0

Спасибо за указание, что это то же самое с прокомментированной строкой или нет, я обновил OP с новым результатом журнала от apache –

+2

'' body '=> 'Извините, но у вас нет доступа к этому', )); } ' Запятая означает, что она ожидает другого элемента в массиве. Но я не уверен, что это проблема. –

0

Прежде всего. Эта ошибка возникает, когда ваш сервер отключается, прежде чем отправлять какие-либо данные. Несколько предложений.

  • ваш код разбивается, и пусть врезаться приложение
  • вашей регистрации ошибок должна быть повышена за счет УВЕДОМЛЕНИЯМИ
  • тесты записи, чтобы проверить каждую часть
  • и должны включать и использовать отладчик (zend_debugger, Xdebug)
  • разместить несколько более подробную информации соединения (например, Wget -O - --debug «URL»)

Существует/был специальный хром вопрос для этого вероит lem http://www.google.pl/support/forum/p/Chrome/thread?tid=3aa7b40eb01a95c8&hl=en#fid_3aa7b40eb01a95c80004ae797939c267

0

Я предлагаю проверить, есть ли пустые строки перед тегами.

Какие имена файлов вы используете ?, существуют ли какие-либо соглашения, которые вы должны соблюдать, чтобы они соответствовали структуре, которую вы могли бы использовать?

0

Интересно, если это проблема сервера, а не проблема коды?

This thread предполагает, что ошибка сервера, которую вы видите (500 преждевременных кончиков заголовков), может быть результатом слишком больших и требующих поворота журналов Apache. Однако это действительно может быть что угодно - кажется, просто предлагает, чтобы сценарий вообще не выводил вывод в браузер.

Еще одна вещь, которую я проверил, - это права доступа к файлам и функционирование include_once и file_exists в методе loadCore, поскольку это выглядит как самая большая область, вызывающая проблемы, которые могут остановить сценарий, даже не выкинув php-ошибку.

0

Возможно, это ошибка символа/кодировки, откройте оба файла с помощью блокнота ++, goto Encoding, затем выберите Convert to UTF-8, сохраните файл и снова проверьте его.

Удачи!

Смежные вопросы