专业编程培训机构——完成蜕变以后轻松拿高薪
电话+V: 152079-09430 ,欢迎咨询php进程超时接口返回504错误分析,论坛出现错误代码怎么办?ED7C0985-B20B-4769-B1A6-4699A333B7E4,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
一、php进程超时接口返回504错误分析
在一次接口测试中,发现返回的http504timeout的错误,然后查看了php-fpm的错误日志,发现了如下错误
从表现上看,是php进程超时导致的进程被kill了,那么这个超时时间以及kill的机制是跟哪些参数有关呢,这里系统这里一下。
Nginx服务一般因为php的错误或者超时会有两种错误码502badGateway或者504GatewayTime-out
一种情况是php产生了语法错误,比如循环调用、变量作用域错误、方法不存在等,如果开启错误日志输出的话,这种错误在php-fpm的错误日志中是可以看到调用栈信息的。
另外一种情况可能就是超时引起的php-fpm主动kill的情况,在php.ini和php.fpm中有两个配置项,用来管理php脚本的最大执行时间
当php脚本的执行时间超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。
以顶部的错误为例,当报502错误是,nginx的errorlog中有如下日志,:
所以只需将这两项的值调大一些就可以让PHP脚本不会因为执行时间长而被终止了。request_terminate_timeout可以覆盖max_execution_time,
所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模块中的max_fail和fail_timeout两项。这两个配置表示在fail_timeout事件内,如果fail的测试达到max_fail,那么在接下来的fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。
所以可以将max_fail调大一些,将fail_timeout调小一些。
PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?
因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置
以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504GatewayTimeout错误时的Nginx错误访问日志如下:
调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。
而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其他应用的话,就配置在自己应用的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而proxy_connect/read/send_timeout是对proxy_pass生效的。
参考链接:http://www.cnblogs.com/fei33423/p/8184098.html感谢分享!
二、php中的错误类型有哪些
php中的错误类型有:1、程序本身的错误;2、未定义符号;3、操作系统所带来的差异;4、PHP配置差异;5、SAPI差异;6、运行错误;7、PHP错误;8、定义错误处理器。
推荐:《PHP视频教程》
PHP的错误类型
一,程序本身的错误
这种错误是比较容易就可以处理的错误,比如说语法错误或者是编译器无法解析,这些错误在编译的时候,就会不通过编译,然后可以根据错误的提示,找到具体的错误代码。但当使用eval()执行的代码发生错误时,在编译期间是发现不了,它只能等到代码在执行的过程中,对其编译产生错误,如我们执行下列代码,就会在执行过程中出现错误:
<?php
echo"thiswillbeechotoputty";
eval("phperrorwhenparser");
?>这种错误和其它的代码错误不同的是,在位于它之前的echo是可以输出的。而其它的代码错误是不会有任何输出的,因为编译就通不过,不会运行。
二,未定义符号
当PHP执行的时候,它可能遇到许多变量、函数等它不知道的名字,因为PHP在编译的时候,并没有完整的了解所有的符号名称、函数名等。
如果只是未定义的常量或者变量,这是只是一个通知的形式告知。但如果是遇到未定义的函数或者类,程序将会终止运行。在关于找不到类的时候,如果用户定义了叫做__autoload的函数,它将在PHP遇到一个未定义的类时调用,如果通过这个函数可以返回类,新加载的类将会被使用,不产生任何错误。
三,通用性错误
3.1操作系统所带来的差异
一些只在某特殊的平台可用的PHP函数。
一些在某特殊的平台不可用的PHP函数。
一些在不同的平台下有着细微差别的PHP函数。
区别文件名中的路径成份的字符。
外部程序或者服务并不是在所有平台中都可用。
3.2PHP配置差异
比如配置选项magic_quotes_gpc,如果这个选项是开启的,PHP将增加斜线到所有的外部数据中。这时,如果将程序移植至另一台没有开启这个选项的服务器上上时,用户的输入就会有问题了。处理类似差异的办法是检查PHP代码并通过ini_get()函数查看选项是否启用,然后作一个统一的调整。
register_globals:该设置决定PHP是否引入GET,POST,cookie,环境变量或者服务器变量为全局变量。一般避免使用。
allow_url_fopen:如果这个选项设置为false,对URL文件操作的功能是关闭的。
3.3SAPI差异
四,运行错误
如对硬盘数据或者网络操作以及数据库调用时,由于PHP本身以外的因素所造成的错误。
五,PHP错误
PHP中的错误机制是被所有的PHP内置函数使用的,通常这个简单的机制打印出一个错误信息,包括一些错误相关的基本信息。
错误级别分为:
E_ERROR:严重错误。
E_WARNING:最普通的错误类型。
E_PARSE:解析错误在编译的时候发生。
E_STRICT:这个错误级别是唯一不包含在E_ALL常量中的,为了让PHP4到PHP5的迁移更加容易。
E_NOTICE:表示运行的代码可能在操作一些未知的事情。
E_CORE_ERROR:由于扩展启动失败等导致的。
E_COMPILE_WARNING:编译的时候出现的警告,告诉用户一些不推荐使用的语法信息。
E_COMPILE_ERROR:编译错误。
E_USER_ERROR
E_USER_WARNING
可以用error_reporting(Integer)函数来设置哪些错误被报告。如所有的错误,表示为E_ALL,除了通告以外的所有错误,可以表示为E_ALL~E_NOTICE.
display_errors(boolean):这个设置控制错误是否作为PHP输出的一部分显示出来。
log_errors(boolean),这个设置控制错误是否记录。日志的地址是通过error_log(String)设置决定的。默认情况下,错误被记录到WEB服务器的错误日志中。
html_errors(boolean):设置控制是否在错误信息中采用HTML格式。六,定义错误处理器
可以调用set_error_handler(error_handle_function,error_types)指定错误处理器。如
functioncustomError($errno,$errstr,$errfile,$errline)
{
echo"<b>Customerror:</b>[$errno]$errstr<br/>";
}
三、论坛出现错误代码怎么办?
PHPhasencounteredanAccessViolationatXXXXXX很多人说,是php版本的问题,更新到高点的PHP能解决,你可以试试,如果还不行\\x0d\\x0a\\x0d\\x0a你再看看以下几点.\\x0d\\x0a1,是否zend所需的dll文件所在目录给的权限不够,必须有读取和运行的权限\\x0d\\x0a2,是否使用的2003,设置过应用池,比如池中限制了什么什么,调整一下再试试看,是否好了,呵呵\\x0d\\x0a3,php.ini有两个地方没有设置,而且一些程序必须用到的\\x0d\\x0a\\x0d\\x0aA\\x0d\\x0a将;upload_tmp_dir该行的注释符,即前面的分号“;”去掉,使该行在php.ini文档中起作用。\\x0d\\x0aupload_tmp_dir是用来定义上传文件存放的临时路径,在这里你还可以给其定义一个绝对路径,例如:\\x0d\\x0aupload_tmp_dir=d:\upload 当然,此时你的d:upload目录必须有读写权限。\\x0d\\x0a这里我设置为\\x0d\\x0aupload_tmp_dir=c:\\temp(因为前面建立了这个文件夹,我图省事,呵呵)\\x0d\\x0a\\x0d\\x0aB\\x0d\\x0a出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将\\x0d\\x0asession.save_path和session.cookie_path设置置为\\x0d\\x0asession_save_path=c:\\temp\\x0d\\x0asession.cookie_path=c:\\temp\\x0d\\x0a然后在c:\\目录下建立一个temp目录,即可(前面我们的eaccelerarot正好用到,建立过这么一个文件\\x0d\\x0a夹)\\x0d\\x0a或者因为安装了一些组件导致。都可以参考下。\\x0d\\x0a最\\x0d\\x0a近我的windows2003服务器频繁出现“PHPhasencounteredanAccessViolationat\\x0d\\x0a××××××”这样的错误,尝试搜索了下,遇到这样问题的人还真不少。我的原因可以锁定在eaccelerator上面,因为之前php运行效率不大满\\x0d\\x0a意,所以装了eaccelerator加速,效果还是不错的,但随着数据库不断加大,查询和更新数据库操作太频繁,出现了“PHPhas\\x0d\\x0aencounteredanAccessViolationat\\x0d\\x0a××××××”这个错误。网上的解决办法无非就是去掉eaccelerator加速,这肯定不行,因为我要用,那就按他们说的配置一下吧,什么临时文件\\x0d\\x0a啊、session路径啊,都改了,还是不行,于是就想是不是mysql版本的问题呢?看了下,发现dll的大小和修改日期还真不一致,于是把mysql\\x0d\\x0a下的dll覆盖了从php里拷贝到系统目录的dll,重启iis,貌似好了,但是重启服务器后又出现了,看来问题不在这,难道是iis应用程序池的问题?\\x0d\\x0a\\x0d\\x0a 尝试去除这个站点的所有限制,但是重启服务器后发现又不行,还是这个错误。观察了下,只要重启iis就能临时解决这个问题,但是这\\x0d\\x0a不治本啊。仔细想了下,既然我的环境没有问题,是在装了eaccelerator后出现问题,那就从eaccelerator下手。仔细检查每个配置,发\\x0d\\x0a现我配置的一点问题都没有,无论eaccelerator的版本、php的版本,还是mysql的版本,都没问题,权限也都够,php.ini配置也正\\x0d\\x0a确,但重启iis就好使一阵子,于是把问题定位到应用程序池。因为我的iis之前配置一点问题都没有。最近看eaccelerator资料是共享内存和硬\\x0d\\x0a盘,难道是iis应用程序池和其他站点共享导致这个问题?于是重新建立应用程序池,把这个应用程序池只独立分配给出问题的站点,适当减少对资源的限制,重\\x0d\\x0a启iis,好使了,重启服务器,也好使了,做了个简单的压力测试,也好使了。【FUTURE PROGRAMMING COURSE】尊享对接老板
电话+V: 152079-09430
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。