2009-12-22 3 views
14

При запуске некоторого кода PHP на моем частном ПК WAMP я вдруг получаю пустой ответ от сервера - на самом деле ответа нет. Нет заголовков, нет данных, ничего в журналах ошибок PHP, nada. Я перезапустил APACHE и PHP, но все равно ничего. Я знаю, что php работает, потому что я могу просто получить доступ к другим PHP-скриптам.PHP создает совершенно белую страницу, никаких ошибок, журналов или заголовков.

Firebug сообщает, что нет заголовков,? байтов, и требуется только «» 163ms «загрузить» (так что это не таймаут). Я думал о быстром потреблении памяти, но я контролировал память своего ПК и не показывал всплесков. До сих пор ошибки и исключения работали нормально.

Что такое Всемирное предприятие?

max_execution_time = 30 ; 
max_input_time = 60 ; 
max_input_nesting_level = 64 ; 
memory_limit = 500M ; 

error_reporting = E_ALL | E_NOTICE | E_STRICT 
display_errors = On 
log_errors = On 

: EDIT:

Я бы не трогать @ с десять футов полюса. Я думаю, что рубины ребята бросают это там, поэтому программисты бросят PHP.

В любом случае, я включил xdebug, и он не выводил файлы размола. Затем я взял совет зомбата и положил DIE() в верхней части страницы, и он сработал. Я предполагаю, что у меня просто есть очень странный код, который полностью убивает PHP. Даже если ошибки были отключены или подавлены с @, я все равно должен возвращать заголовок с сервера с пустым содержимым!

Если я нахожу больше, я отправлю обратно.

+0

Где это вход ошибки в? Может быть, это вход в файл или в stderr? –

+1

Что произойдет, если вы вызовете ресурс, отличный от PHP? Это работает? Можете ли вы попробовать phpinfo(), чтобы проверить, используете ли вы правильный php.ini? –

+1

Опубликовать код PHP, который ничего не выводит. – Asaph

ответ

1

Я догадался, ответ на эту проблему - выясняется, что PHP 5.2.5 не может справиться с рекурсивной смертью.

<?php 

class A 
{ 
    public function __construct() 
    { 
     new B; 
    } 
} 

class B 
{ 
    public function __construct() 
    { 
     new A; 
    } 
} 

new A; 

print 'Loaded Class A'; 

Нет заголовков, ошибки, содержание, журналы, Xdebug отвалы, шипы памяти, спайки CPU, сбой сервера, или что-нибудь. После примерно 150 мс PHP просто «кончается». Weird.

+0

Исправлено в PHP 5.3.0 'Неустранимая ошибка: максимальный уровень вложенности функции '100' достигнут, прерванный!' – Xeoncross

+2

Если у вас есть ответ, вы должны отметить эту проблему как разрешенную, чтобы другие не тратили свое время пытаясь помочь вам. – SamGoody

+1

Я не могу, stackoverflow заставляет меня ждать. Еще через десять часов я смогу закрыть его. – Xeoncross

-2

Вы проверили файлы для закрытия ?> теги? Или, что более важно, какие-либо пробелы после них ...

6

В этом каталоге может быть файл .htaccess, который изменил отчет об ошибках.

Чтобы проверить, попробуйте явно установить эти параметры в верхней части вашего скрипта php, что дает вам проблемы.

ini_set('display_errors',1); 
error_reporting(E_ALL); 

Я также видел это из-за чрезмерно усердных антивирусных пакетов. Некоторые из них содержат веб-прокси-программное обеспечение для фильтрации Интернета и электронной почты. В этом случае страница будет просто продолжать загрузку в бесконечность, но никогда не будет завершена.

0

проверить журнал событий.

1

Проверить php.ini настройки для short_open_tag = On или Off short_open_tag =

+0

Если короткие открытые теги были выключены, то php выйдет на визуализированную страницу. Страница не будет пустой. –

1

Скорее всего, здесь является то, что апач происходит сбой. Возможно, просмотрите журнал ошибок apache или присоедините отладчик.

Подробная информация о глядя отладки процесса Apache/PHP на окнах можно найти на http://bugs.php.net/bugs-generating-backtrace-win32.php

+0

+1, хотя в случае аварии он найдет запись в журнале событий. проще, чем прервать отладчик. –

+0

Совсем не пользователь Windows, не знал, что журнал событий показал эти вещи :) Спасибо. –

6

Остерегайтесь (подавление ошибок) оператор @, если у вас есть ошибка синтаксиса на линии с @ PHP молча выйти.

Чтобы обнаружить это условие, используйте set_error_handler и напишите свой собственный обработчик ошибок, вы все равно получите вызванные ошибки, если используется @.

+1

+1 - оператор подавления ошибок является личным заклятием. – zombat

+0

Существует расширение pecl, которое может использоваться для решения этой конкретной проблемы. Соответствующий титульный крик: http://pecl.php.net/scream –

+0

При использовании файла @include (_once) '; Он не только не сообщает о сбое включения, но также будет подавлять ошибки, сгенерированные этим файлом. –

8

Запустите страницу с консоли, и вы получите сообщение об ошибке.

// nix 
php yourFile.php 

// Windows 
c:\path\to\php.exe yourFile.php 
6

Вы говорите, что другие PHP-скрипты работают, поэтому это означает, что это, вероятно, не проблема Apache. У вас также есть все правильные настройки ведения журнала, и ничего не регистрируется, поэтому вполне возможно, что PHP выходит нормально, прежде чем он выведет что-нибудь. Может быть выполнено одно из следующего:

  • Неуместное заявление exit()? Вы работали над кодом, возможно, вы добавили быстрый exit(), чтобы проверить что-то, и забыл удалить его?
  • Идея don.neufeld по проверке использования оператора @, которая подавляет любые сообщения об ошибках, стоила мне часов отладки в прошлом. Определенно, что-то искать.

В подобных ситуациях подход отладки бедняка может дать некоторые быстрые результаты. Бросьте exit('wtf'); в качестве первой строки в рассматриваемом скрипте. Это работает? Результаты этого теста сразу же исключают всевозможные возможности независимо от результата. Если вы не получаете какой-либо вывод, то это, вероятно, проблема на уровне сервера (конфигурация, плохой модуль и т. Д.), Хотя будьте осторожны с буферизацией более высокого уровня. Если вы получаете выход, то вы знаете, что сервер в порядке, и проблема лежит глубже в вашем скрипте, и в этом случае вы можете переместить вызов exit() на несколько строк, полоскать и повторить. Не элегантный способ отладки, но он быстрый и грязный, и вы, вероятно, найдете проблему через пару минут.

+4

+1 удивительная фраза выхода – Xeoncross

0

Когда это происходит, обычно стоит вырезать как можно больше кода и видеть, можете ли вы получить что-то на странице, чтобы показать.

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

И, хотя все ошибки ДОЛЖНЫ сообщаться, я обнаружил, что на самом деле не все сообщения об ошибках, возможно, из-за настроек ini на который находится вне моей досягаемости.

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

+0

Правда, но даже опечатки приводят к некоторой форме ошибки. – Xeoncross

1

Чтобы активировать отображение ошибок в вашем PHP кода в случае, если вы не видите ничего, вставить

ini_set('display_errors',1); 
error_reporting(E_ALL); 

пример, где это potentialy экономит много времени:

Этот код в Группах по умолчанию ,Шаблон PHP-файл отображает пустую страницу без каких-либо ошибок сообщ без линий 20 и 21

17 <?php if ($params->get('title_article_linkable')) { ?> 
18  <a href="<?php 
19   $url = JRoute::_(ContentHelperRoute::getArticleRoute($item->id,$item->catid)); 
20   ini_set('display_errors',1); 
21   error_reporting(E_ALL); 
22   echo $url; ?>"> 
23  <?php echo $this->item->title; ?></a> // should be $item->title !! 
24 <?phpLL000000 } else { ?> 
25  <?php echo $item->title; ?> 
26 <?php } ?> 

Выходные:

enter image description here

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