技术饭
nginx下运行php的程序时返回200访问却是空白页问题的解决方法
这几天一直在研究小程序,开发的差不多的时候吧环境从php5切换到了php7之后发现了很多的问题,比如传入参数没有默认值等造成的问题,但另一个棘手的问题就是:nginx下运行php的程序时返回200访问却是空白页,接口请求成功但是却一直无法返回数据,经过不断反复测试,代码断点测试,最后才发现了问题所在。
起初搜索:php7 返回200空白
搜索到的解决方案:
ngxin中安装php-fpm后,html静态页面没问题,不过,虽然phpinfo页面返回200状态码,但浏览却总是空白页,也没有任何报错。
考虑应该是nginx已经将php页面转移给php处理了,所以问题应该在php的配置上,经过查找,发现需要在nginx中加入一句话:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
安装完nginx后,默认的fastcgi_params配置文件中没有上面这句。
在nginx.conf中的
复制代码 代码如下:
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php; #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;
}
或在fastcgi_params配置文件中加入:
复制代码 代码如下:
# PHP only, required if PHP was built with --enable-force-cgi-redirectfastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
重启nginx,即可正常显示页面了。
重点是上面的方案并不能解决现在所遇到的问题,有点懵逼了......
最终解决方案:代码断点调试,原来问题出在了json_encode()的解析时数据返回的NAN数据无法解析,才返回了空白,NAN的数据原因是因为除法除数为0的缘故
php json_encode输出为空问题,这种情况一般是json_encode序列化数组时出现错误,错误原因有很多,可以通过json_last_error函数来查看错误原因!!!
可能的原因
-----------------------------------------------------------
1、反斜杠,可以用stripslashes() 函数删除由 addslashes() 函数添加的反斜杠,可能还要用到urlencode ()— 编码 URL 字符串
-----------------------------------------------------------
json_last_error函数手册地址(http://www.php.net/manual/zh/function.json-last-error.php)
-----------------------------------------------------------
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — 返回最后发生的错误
说明
-----------------------------------------------------------
int json_last_error ( void ) 如果有,返回 JSON 编码解码时最后发生的错误。
参数
-----------------------------------------------------------
此函数没有参数。
返回值
-----------------------------------------------------------
返回一个整型(integer),这个值会是以下的常量之一:
JSON_ERROR_NONE 没有错误发生
JSON_ERROR_DEPTH 到达了最大堆栈深度
JSON_ERROR_STATE_MISMATCH 无效或异常的 JSON
JSON_ERROR_CTRL_CHAR 控制字符错误,可能是编码不对
JSON_ERROR_SYNTAX 语法错误
JSON_ERROR_UTF8 异常的 UTF-8 字符,也许是因为不正确的编码。 PHP 5.3.3
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded PHP 5.5.0
JSON_ERROR_INF_OR_NAN One or more NAN or INF values in the value to be encoded PHP 5.5.0
JSON_ERROR_UNSUPPORTED_TYPE 指定的类型,值无法编码。 PHP 5.5.0
JSON_ERROR_INVALID_PROPERTY_NAME 指定的属性名无法编码。 PHP 7.0.0
JSON_ERROR_UTF16 畸形的 UTF-16 字符,可能因为字符编码不正确。 PHP 7.0.0
-----------------------------------------------------------
echo json_encode(array('error' => '0', 'message' => '没有错误'));
var_dump(json_last_error());
//这里也可以是json_decode
//错误码对照
0 JSON_ERROR_NONE
1 JSON_ERROR_DEPTH
2 JSON_ERROR_STATE_MISMATCH
3 JSON_ERROR_CTRL_CHAR
4 JSON_ERROR_SYNTAX
5 JSON_ERROR_UTF8
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
-----------------------------------------------------------
执行json_last_error()函数,最终返回的结果是7,也就是 JSON_ERROR_INF_OR_NAN ,这才解决json_encode()解析空白的问题!!!
文明上网理性发言!