解决:LNMP架构下访问php页⾯出现500错误现在LNMP架构很流⾏,
然⽽有时我们会遇到⼀个莫名其妙的问题,
就是我们访问php页⾯时服务器返回"HTTP/1.1 500 Internal Server Error"错误
这个错误让⼈匪夷所思,还以为是nginx出问题了呢?
其实是php代码语法错误导致的
默认情况下,如果被访问的php脚本中包含语法错误,服务器会返回⼀个空的“200 ok”页⾯
在php.ini中的_header选项允许在这种情况下产⽣⼀个HTTP错误码
以使web服务器可以正确拦截并处理这个错误码,类似直接在php代码中调⽤header()返回500状态码,如
header("HTTP/1.1 500 Internal Server Error");
通过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中设置 _header 选项即可,如返回503:
<_header = "HTTP/1.1 503 PHP Parse Error"
这样就可以显⽰出错误的根本原因,可以在部署LNMP时加上
没加这个选项时,可以通过下⾯⽅法调试:
将访问出错的页⾯拷贝⼀个,成测试⽂件,防⽌影响线上业务和安全问题
如:cp index.st.php
打开 display_errors 选项,在⽂件开头加⼊如下内容:
ini_set('display_errors','1');
error_reporting(E_ALL);
这样就可以将错误暴露出来,完毕!
前⼏天就遇到了这个500错误问题,情况是这样的:
有开发⼈员说⽹站访问出现500错误,他说ie和chrome都访问不了,只有firefox可以访问,我⾃⼰也试
了试,ie和chrome确实不能访问,我机器没装firefox,所以没试,我突然想起以前公司也遇到过这个问题,所以想到了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(function_exists('getClientIP'))调试,输出false,问题就在这⾥了,定义好这个函数就解决了。可是为什么firefox可以访问,⽽ie和chrome不能访问呢?这是因为firefox⾥⾯存在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()
parse error怎么解决另外在 f 中设置的php.ini选项优先于在php.ini中设置的选项,如
在 php.ini 中设置 display_errors = on
在 f 中设置 php_flag[display_errors] = off
那么结果是 off
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论