我刚刚在 Windows Server 2003 机器上安装了 Zend Server Community Edition,但是我们的许多 PHP 页面的显示都出现了一些问题。代码之前在 IIS 上的同一版本的 PHP (5.3) 下运行,没有任何问题。
从表面上看,当 Apache(作为 Zend Server 的一部分安装)在 PHP 中遇到它不喜欢的内容时,它会在页面呈现过程中出错。通过查看代码,我能够通过从函数调用中删除错误抑制运算符 (@) 并更改某些包含的格式来解决一些问题。但是,我无法对整个网站执行此操作!
奇怪的是,错误代码被报告为“200 OK”。下面的代码片段显示了 Apache 错误 HTML 如何中断页面的常规 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,
[email protected] 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 搜索技能,因此任何帮助都将不胜感激。谢谢。
答案1
您将需要查看您的代码。
我立即想到的是,您正在通过 HTTP(您已启用)include()(或使用类似函数)页面或脚本allow_url_fopen
,而包含的页面/脚本所运行的服务器出现了问题。
如果你编辑 php.ini(并重新启动 Apache)将其更改allow_url_fopen
为错误的,您的托管环境将拥有更好的安全性,并且很可能会得到更好的错误提示,告诉您尝试包含损坏的 URL 的位置。
答案2
@ 错误抑制运算符成本高昂 - 更好的选择是使用 error_reporting( 0 ) 来禁用错误,或者使用您自己的函数。
在这种情况下,由于您根本没有信息,您可以尝试使用此错误处理程序代替默认处理程序,看看是否可以将此错误与导致 apache 崩溃的 PHP 函数联系起来。
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" );