Назад | Перейти на главную страницу

Apache отображает страницу ошибки на полпути выполнения страницы PHP

Я только что установил Zend Server Community Edition на компьютере с Windows Server 2003, однако есть небольшая проблема с отображением многих наших страниц PHP. Код ранее работал под той же версией PHP (5.3) в IIS без каких-либо проблем.

Судя по всему, Apache (установленный как часть Zend Server) выдает ошибку во время рендеринга страницы, когда сталкивается с чем-то, что ему не нравится в PHP. Проходя код, я смог обойти некоторые проблемы, удалив оператор подавления ошибок (@) из вызовов функций и изменив формат некоторых включений. Однако я не могу сделать это для всего сайта!

Как ни странно, код ошибки отображается как «200 OK». Приведенный ниже фрагмент кода показывает, как HTML-код ошибки Apache прерывает обычный HTML-код страницы.

<p>Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari quam ti del coalescent lingues.</<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>200 OK</title>
</head><body>
<h1>OK</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
 example@example.com and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log

Журнал ошибок Apache не предлагает никаких объяснений для этого, и я исчерпал свои навыки работы с Google, поэтому любая помощь будет принята с благодарностью. Спасибо.

Вы захотите просмотреть свой код.

Я сразу же думаю, что вы включаете () (или аналогичную функцию) страницу или скрипт через HTTP (у вас есть allow_url_fopen включен), и на сервере, на котором работает включенная страница / сценарий, возникают проблемы.

Если вы отредактируете php.ini (и перезапустите Apache), чтобы изменить allow_url_fopen к ложный, вы будете лучше защищены в своей среде хостинга, а также, скорее всего, получите лучшую ошибку, сообщающую вам, где вы пытаетесь включить неработающий URL.

Оператор подавления ошибок @ дорогостоящий - лучший вариант - использовать error_reporting (0) для отключения ошибок или использовать вашу собственную функцию.

В этом случае, поскольку у вас вообще нет информации, вы можете попробовать использовать этот обработчик ошибок вместо обработчика по умолчанию, чтобы увидеть, можете ли вы связать эту ошибку с функцией PHP, вызывающей сбой apache.

function Andy_errorHandler( $errno, $errstr, $errfile, $errline ) {
    $stack_trace = '';
    switch ( $errno ) {
        case E_NOTICE:
        case E_USER_NOTICE:
        case E_STRICT:
            return;
            break;
        default:
            try {   
                throw new Exception( $errstr, $errno );   
            } catch( Exception $e ) {
                //build stack trace
                $stack_trace .= "File: <b>$errfile</b> Line: <b>$errline\n" . $e->getMessage() . "</b>\n" . "Error No: ".$e->getCode(). "\n";
                $stack_trace .= $e->getTraceAsString();
            }       
        break;
    }

    if( ! isset( $GLOBALS['error_handler_output'] ) ) {
        $GLOBALS['error_handler_output'] = nl2br( $stack_trace ) . '<p/>'; 
    } else {
        $GLOBALS['error_handler_output'] .= nl2br( $stack_trace ) . '<p/>'; 
    }

    return true;
}
$old_error_handler = set_error_handler( "Andy_errorHandler" );