84 views

解决方法:在lnmp架构下浏览php网页页面时出現500个不正确

By | 2019年3月3日

现在LNMP架构非常流行。

然而,有时我们会遇到一个令人费解的问题。

当我们访问PHP页面时,服务器返回“http/1.1500内部服务器错误”错误。

这个错误太不可思议了。你认为nginx有问题吗?

它实际上是由PHP代码中的语法错误引起的

默认情况下,如果访问的PHP脚本包含语法错误,服务器将返回一个空的“200OK”页面。

FASCGI。php.ini中的error_header选项允许在这种情况下生成HTTP错误代码

为了使Web服务器能够正确地拦截和处理这个错误代码,它类似于在PHP代码中直接调用header()以返回500个状态代码,例如

头(“HTTP/1.1500内部服务器错误”);

从PHP源代码也可以看出,这次使用的PHP版本是:php-5.3.26

源文件是:php-5.3.26/main/main.c

第1110行,如下:

if(!PG(display_errors) && !SG(headers_sent) && SG(sapi_headers).http_response_code == 200){
sapi_header_line ctr = {0};
ctr.line = “HTTP/1.0 500 Internal Server Error”;
ctr.line_len = strlen(ctr.line);
sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC);
}
通过if条件可以得知,在满足 display_errors=0 和 headers_sent=0即空白页和

http_response_code=200的条件下返回500错误

乍一看,这500个错误很容易被误认为是nginx错误,可以调整为其他响应代码。

只要在php.ini中设置 fastcgi.error_header 选项即可,如返回503:

fastcgi.error_header = “HTTP/1.1 503 PHP Parse Error”

这显示了错误的根本原因,可以在部署lnmp时添加。

如果没有此选项,可以通过以下方法进行调试:

将访问错误的页面复制到测试文件中,以防止出现在线业务和安全问题

如:cp index.php index.test.php

打开 display_errors 选项,在文件开头加入如下内容:

ini_set(‘display_errors’,’1′);
error_reporting(E_ALL);
这样就可以将错误暴露出来,完毕!

几天前,我遇到了这个500个错误问题。情况如下:

一位开发人员说,网站访问中有500个错误。他说IE和Chrome都无法访问。只能访问Firefox。我自己试过了。无法访问IE和Chrome。我的机器没有安装火狐,所以我没有尝试。我突然想起公司以前遇到过这个问题。所以我想到了cookie,去服务器上检查PHP程序代码。最后,我发现这样一段代码:
protected function __construct($domain){

session_name(self::sess_name);
$this->sess_id = empty($_COOKIE[session_name()]) ? $this->gen_sid() : $_COOKIE[session_name()];

}
private function gen_sid(){
return md5(uniqid(microtime() . getClientIP(), true));
}
当程序运行到第9行时,将发生500个错误。最可能的原因是getclientip函数。直接调用此函数仍返回500个错误。使用var_dump(函数_exists(“getclientip”)进行调试并输出false,问题就在这里。定义这个函数可以解决这个问题。但为什么火狐可以访问,而IE和Chrome不能访问?这是因为火狐中有cookie,IE和Chrome都是第一次访问。没有cookie,为什么没有cookie会出现这个问题?这是由于:

$this->sess_id = empty($_COOKIE[session_name()]) ? $this->gen_sid() : $_COOKIE[session_name()];
第一次访问没有cookie,所以empty($_COOKIE[session_name()])为true,

它将调用$this->gen_sid(),并且会出现错误,上面找不到getclientip函数。如果存在cookie,它不会调用$this->gen_sid(),而是在冒号后面返回$_cookie[session_name()]。没关系。哈哈!事实上,这样做有点冗长。如果直接打开错误报告,则会出现错误,例如:

ini_set(‘display_errors’,’1′);
error_reporting(E_ALL);
显示如下错误信息,很容易就发现问题了,good

Fatal error: Call to undefined function getClientIP()

另外在 php-fpm.conf 中设置的php.ini选项优先于在php.ini中设置的选项,如

在 php.ini 中设置 display_errors = on

在 php-fpm.conf 中设置 php_flag[display_errors] = off

那么结果是 off

本文转载于:http://win-man.com
本文关键词:网络编程教程 高防CDN 加速CDN 免备案CDN
作者:编程咨询

发表评论

电子邮件地址不会被公开。 必填项已用*标注