[喵咪PHP]页面显示空白问题
#[喵咪PHP]页面显示空白问题#
##前言##
哈喽!大家好啊,喵咪PHP第一次和大家见面了,熟悉的朋友呢也之道喵咪我也开了喵咪Liunx和喵咪Golang这两个坑目的呢是吧平常遇到的一些问题或者是在学习中的东西好工具分享出来和大家交流沟通,今天要讲的问题是大家在PHP开发中常常会遇到的页面一片惨白啥内容都没有的问题,喵咪最近也是被一个很奇葩的问题给坑了一下,那么话不多说那就来和喵咪一起看看为什么PHP会返回空白页面呢?
附上:
喵了个咪的博客:w-blog.cn
PhalApi官网地址:http://www.phalapi.net/
开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release
##1. 了解PHP报错机制##
其实在平常PhalApi回答各位小伙伴问题的时候常常会有童鞋截了图问我,怎么调用接口没有反应呢?
这类问题往往大家对与PHP的报错机制不是太了解导致了使用默认配置在运行出错了程序结束了并没有把报错信息打印出来但是程序也没办法执行下去,其中两个至关重要的两个配置在php.ini中,我们一般用如下配置,把所有报错类型都打印出来:
#错误等级,不同的配置会打印不同的错误和警告
error_reporting = E_ALL
//是否开启报错
display_errors = ON
我们来看一下error_reporting可以设置的参数种类:
E_ALL – 所有的错误和警告(不包括 E_STRICT)
E_ERROR – 致命性的运行时错误
E_WARNING – 运行时警告(非致命性错误)
E_PARSE – 编译时解析错误
一般以上就是我们经常用到的
提示:建议开发测试环境使用E_ALL排除所有的错误和警告养成良好的编码习惯,在生产环境时关闭display_errors避免不必要的请求失败
##2. Nginx这个锅你说你接不接##
第二个问题就比较有意思了,我们来一同了解一下事情的经过
###2.1 事情是这样的
在工作中做Excel导出功能,发现了一个问题我导出的内容只有69条多了就没有了(原本8000多条记录),然后直接请求接口之后返回值是一片空白,通过调试发现200条一下都可以成功导出多了不行.找了nginx报错日志,php日志都没有问题
###2.2 问题剖析
是不是很玄学,200条可以多了不行,没有任何error记录,更奇怪的是我有一个环境是可以成功导出的,奇怪吧?
前后怀疑过是不是php运行内存是不是给少了,查了一下我给了192MB肯定是够的,是不是nginx缓冲区给少了,查了下也没有问题,是不是我使用的excel导出的姿势有问题呢?换了两个类库也没问题,那到底是为什么呢
**排除法:**这个事件中有两个角色是最大的怀疑对象,Nginx,PHP,我们先使用PHP通过cli的方式请求接口,发现该打印的都ok,那么所有的矛头都指向了Nginx了,但是Nginx也没有错误日志啊,费劲千辛万苦也没有找到原因只能到处求助,最后是一个同事的一句话惊醒了梦中人,会不会是权限问题,我会想起了一件事情Nginx是www权限开始配好了,后面进行发布工具部署的时候创建了一个发布工具的用户,然后把所有WEB运行的用户权限都指向了这个用户,检查了一下果真还是www用户,所以是没有权限的问题
###2.3 什么原理
究竟是什么原理导致的这个问题,通过分析考证,PHP在打印的时候是实时输出也就是echo一句就是打印一句,但是Nginx或者说WEB程序并不是这样的,他们都是把所有的返回结果一并返回,Nginx有一个buff缓冲区大小是64K,当你的页面返回的文本大小大于64k的时候就会把需要输出的内容记录到本地然后在执行结束了一并输出,但是正好这个时候应为更换了Nginx的运行用户为发布用户,这个时候失去了权限导致写不成功就失败了,然后想要记录ERROR日志的时候发现error目录也没有权限也就没有写入error日志
###2.4 请接好我的锅
会想起一件事情我意识到这个问题的严重性,有一次领导说我们的网站怎么打不开了好多客户在反应,然后我去查了下服务器发现Nginx竟然死了,找了好久的error日志也没有,最后加了一个监控不了了之,原来都是没有权限记录error日志的锅
为什么Nginx不检查权限呢?你就说吧这个锅你接不接
##3. 总结##
出现了两个问题一个是导出Excel的时候出现了截断的问题,另外一个是Nginx死了无证可查的问题,这都是应为没有给Nginx赋予权限的问题,分享出来给大家作为参考,也希望大家不要犯和喵咪一样的这种错误.
最后声明一下Nginx是一个很好的软件问题都是喵咪不细心的问题,只是希望写的幽默一点把锅甩给了Nginx
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
PhalApi官网QQ交流群:421032344 欢迎大家的加入!
- 数据结构C#版笔记--顺序表(SeqList)
- 数据结构C#版笔记--单链表(LinkList)
- 操作系统 页式存储 页与块之间的关系详解
- 数据结构C#版笔记--双向链表(DbLinkList)
- 斐波那契数列与IE9
- DateTime.ToString()输出"年/月/日 时:分:秒"的格式
- Flash在线拍摄用户头象
- win7 64位下如何折腾Tubro C 3.0
- TweenLite的又一应用:图片的拼图加载效果
- mysql创建数据表时如何判断是否已经存在?
- 温故知新:接口的隐式实现与显式实现
- 也谈枚举ToString()性能的改进
- silverlight:利用telerik中的zip类对字符串进行压缩、解压
- 索引,视图,存储过程和触发器文档
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 浅谈Linux的编码及编码转换方法
- 在 Linux 上用 DNS 实现简单的负载均衡的方法
- centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法
- Linux CentOS使用crontab设置定时重启的方法
- centos安装php5、卸载php、安装php7的教程
- centos7中crontab定时计划任务5分钟一次命令写法
- Ubuntu16.04 安装Teamviewer的教程详解
- 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
- 详解Linux iptables 命令
- 详解fedora 开启 apache 并 开启目录浏览模式
- CentOS新建用户并使能密钥登录的方法
- Linux系统扩容根目录磁盘空间的操作方法
- Linux如何查看进程栈信息示例
- linux查看硬盘大小与挂载硬盘的实现
- centos6.5 安装hadoop1.2.1的教程详解【亲测版】