您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
关于php500错误communication error(return code 0或return code 9)
发布时间:2020-06-21 09:18:53编辑:雪饮阅读()
说到服务端500错误,屡见不鲜,该错误是一个因素比较繁多的错误。而对于php来说大多数情况只要错误级别开启到位如
error_reporting(E_ALL);
ini_set("display_errors","On");
但是在有些特殊情况下php自身都挂了,此时错误自然捕获不到,最近用curl发送大文件给一个接口的时候发现总是容易出现500,纠结后错误终于曝露出来,我这里的服务器用的是apache2.4.39,Php版本是5.3.29nts
其实只要在apache这里配置日志级别为debug
然后我们查看apache的error.log日志
然后发现本次500错误是频繁的出现“php-cgi.exe(21232) exit(communication error), return code 0”或者“php-cgi.exe(21232) exit(communication error), return code 9”
而从error.log中会发现无论上面的任何一个错误出现之前都有一个“gracefully terminated 1 processes”的日志条目,意思是说apache优雅的终止了一条进程。。。。
这也叫优雅,都500了还优雅。。。
好吧,那么现在问题的关键就是gracefully terminated 1 processes
几经折腾,关键在于这几项配置
其中<IfModule mod_fcgid.c>这个段以及FcgidConnectTimeout 100是我添加的
然后重启下apache即可解决该问题,如果还不行就继续根据自身情况调整吧,我这里是用php发送87.6MB的文件导致的错误,该配置加入以后就没有问题了,对于此有些人可能会说只要提升php.ini中对于文件上传相关的上限,如upload_max_filesize、max_execution_time、memory_limit 其实此次这些配置此次是已经加过了的哈哈,不然肯定是php自身报错日志了。而不是php直接挂掉的日志了。
上面相关配置的解析如下:
IdleTimeout 发呆时限
ProcessLifeTime 一个进程的最长生命周期,过期之后无条件kill
MaxProcessCount 最大进程个数
DefaultMinClassProcessCount 每个程序启动的最小进程个数
DefaultMaxClassProcessCount 每个程序启动的最大进程个数
IPCConnectTimeout 程序响应超时时间
IPCCommTimeout 与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
MaxRequestsPerProcess 每个进程最多完成处理个数,达成后自杀,因为PHP最多只处理500次请求。不过这个是mod_fcgid 1.11版本添加的,我们主机上暂时不支持。
总结:
对于本次实例,最重要的是下面的参数:
<IfModule mod_fcgid.c>
IdleTimeout 600
ProcessLifeTime 3600
IPCCommTimeout 600
</IfModule>
FcgidMaxRequestLen 51200000
上面其它参数可以在极特殊情况下再行调优
关键字词:php,500,communication error,return code 0,return code 9,gracefully terminated 1