PHP第二十七篇——服务器500错误总结

之前做客户端开发的时候,经常出现500错误,当时能做的就是告诉后台:某某api出现了500,然后没有几分钟就好了。而且一个项目下来出现最多次数的也就是500……

500错误

接触了服务器开发之后,自己在写一些简单接口的时候,也总是发现500,而且几乎所有的500都不是一样原因导致,所以就找了一些教程,并请教了有些大神,自己在接口开发中也掌握了不少相关了技巧。

如果你在学习或者开发中也遇到了,比较奇葩500错误,可以联系我,我们一起交流讨论,一并整理出来。

出现500错误的原因是很多的,一般来说,如果程序出错,那么在浏览器内会返回给用户一个友好的错误提示,统一称之为服务器500错误。 解决的方法就是您必须在http中能够正确的获得错误信息,方法为:请打开浏览器,选择工具,internet选项,高级,在高级中的浏览项目里面有一个\"显示http友好错误提示\"的复选框,请取消该复选框,这样您可以获得正确的错误提示。 在获得正确的错误提示之后,您就可以根据该错误提示检查您具体的出错原因了

HTTP 500错误一定是你的PHP代码有错误,PHP解释器执行不了。两个方法找错误

1) 用有语法检查提示的编辑器,比如Eclipse打开你的文件看看有没有错误提示,注意require里面的文件也要检查
2) 加error_log("error_message", 3, "log.txt");在你想输出信息的地方,用这种方式找代码哪句有问题。

当我我们一定时常注意log的日志,因为大部分错误或者异常在log都能清楚,或者通过分析找到问题所在并解决

1 先看nginx error.log 指定的错误日记文件路径 找到这个日记文件看 里面信息

2 再看  php-fpm.conf 里面指定的PHP错误日记的路径

具体如下

php_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /data/logs/fpm-php.log

在网上找到一段话,这是在windows上开发的时候出现的问题及解决方案,当然Mac上也差不多

1、运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误。减小用户数或者场景持续时间,问题得到解决。
2、该做关联的地方没有去做关联,则报HTTP500错误。进行手工或者自动关联,问题得到解决。
3、录制时请求的页面、图片等,在回放的时候服务器找不到,则报HTTP500错误,若该页面无关紧要,则可以在脚本中注释掉,问题将会得到解决。例如:有验证码的情况下,尽管测试时已经屏蔽了,但是录制的时候提交了请求,但回放的时候不存在响应。
4、参数化时的取值有问题,则报HTTP500错误。可将参数化列表中的数值,拿到实际应用系统中进行测试,可排除问题。
5、更换了应用服务器(中间件的更换,如tomcat、websphere、jboss等),还是利用原先录制的脚本去运行,则很可能报HTTP500错误。因为各种应用服务器处理的机制不一样,所录制的脚本也不一样,解决办法只有重新录制脚本。
6、Windowsxp2 与ISS组件不兼容,则有可能导致HTTP500错误。对ISS组件进行调整后问题解决。
7、系统开发程序写的有问题,则报HTTP500错误。例如有些指针问题没有处理好的,有空指针情况的存在。修改程序后问题解决。
8、如果测试中所进行的操作涉及到数据库,如插入数据操作,若大数据量的情况下导致数据库中表空间已满,或者数据库连接池较小无法满足数据的存取等,都有可能导致HTTP500错误。调整数据库、修改连接池大小,问题解决。

下面是某教程网站上在Nginx上出现的一个棘手的500错误。。

原文地址:https://www.phpxy.com/article/109.html

产生原因:

恢复aliyun阿里云的镜像,发现不论如何访问服务器都提示500

出现了问500错误,第一件事情要处理的是查看日志。

1. 日志系统是否记录了日志

2. 发现日志系统未记录日志,所以说不好去发现问题。

3. 解决nginx未记录日志的问题,在/usr/local/nginx/conf/vhost/ uluqu.com.conf下增加error_log选项指定至目录

4. 发现nginx无法启动,错误提示 /var/log/nginx 目录未存在

5.使用mkdir 创建/var/log/nginx 目录

6. 重新启动nginx,php-fpm等,发现解决成功

7. 打开错误日志目录,发现日志已生成

8.访问 www.uluqu.com/index.php 和phpinfo.php 页面,查看日志中记录的两项错误

9. 错误提醒分别为php parse error define错误,第二个是发现 memory allowed limit 类的错误。分析原因是内存不足或者未合理管理内存造的。

10. 清理服务器内存 free -m 然后执行echo 1 > /proc/sys/vm/drop_caches

11. 再次判断可能因为php.ini文件出错,解决办法:修改php.ini中的memroy_limit参数

12. 经查发现memroy_limit 这个参数写的是512而不是512M。修改参数,重启相关服务。

13. 访问地址问题解决

在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。

解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。

检查php的内存限制值

为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。

memory_limit应该设为多少?

这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal 6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。

方法1: php.ini

最简单或常用的方法是修改php.ini

1.首先找到对你的网站生效的php.ini文件 由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。

对于Linux用户,你可以通过执行“php -i | grep Loaded Configuration File”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。

2.编辑php.ini 在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例

memory_limit = 128M ; 可以将128M改为任何你想设置的值,保存文件

3.重启web 服务器 如果是web服务器使用Apache, 则执行:

httpd restart

有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。

方法2: .htaccess

说明: 这种方法只有在php以Apache模块来执行时才生效。 在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中

php_value memory_limit 128M ; 可以将128M改为任何你想设置的值

方法3: 运行时修改php的内存设置

在你的php代码中增加以下命令行即可。

ini_set('memory_limit','128M');

memory_limit修改失败

如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。

生产环境下故障处理一例

现象说明:

生产环境下,storage服务器上没有安装任何服务(如apache,nginx,IIS等)现在是纯命令行执行PHP跑PHP脚本,在脚本的执行过程中发现(脚本内容含每次取5000个文件然后执行其它操作)速度奇慢,在本地测试时分分钟内搞定的事,在线上要执行2个多小时,经过排查排除掉服务器负载问题、数据库问题、服务器网络问题后,认为可能是php.ini配置文件中的资源限制所引起,于是修改了一下memory_limit将默认值128M修改为1024M后再次执行原脚本,速度得到大幅度提升,现把此参数的含义说明一下。

修改后需不需要重启?

因为PHP没有守护进程一说,理论上你只要修改过以后,就会立即使用新的配置文件。

此值设置多大为好?

建议根据应用需求来设置。物理服务器,如果内存够大的话建议限制内存较大一些如512M,1024M都可,如果是VPS之类的可能限制在128(默认)64M或者以下是比较合适的,特别是有web服务器的时候,一旦开启多个php的fast-cgi,估计服务器都卡的不动了。

参数语法

memory_limit integer

本指令设定了一个脚本所能够申请到的最大内存字节数。

指令作用

这有助于防止写得不好的脚本消耗光服务器上的可用内存。

在phpchina的论坛上,有人这样说:

memory_limit是设置PHP使用内存时空间,一般设置为内存的四分之一,应该就差不多了。如512M内存设置128M,1G内存设置256M。

设置太大会影响系统速度,因为系统和数据库及其他程序同样需要内存空间,一般系统和数据库内存空间是自己分配的。

附三种修改方法

可能是分词程序的问题。只要搜索的字段达到十个汉字以上,就会出现诸如以下的错误

Fatal error: Allowed memory size of 2345643 bytes exhausted

上网找了方法。有3种办法。

1.直接修改PHP.INI

memory_limit = 16M  ;

但是我修改了没有用。据说是要重启服务器的。但是很显然。我的 是虚拟主机。所以有独立主机的可以这样修改。

2.修改.htaccess

php_value memory_limit 16M

修改后直接出现500错误。可能是主机商限制

3.直接在程序页面上修改。

ini_set(’memory_limit’, ‘16M‘);
坚持原创技术分享,您的支持将鼓励我继续创作!