找回密码
 立即注册
首页 业界区 安全 Windows环境下Apache+PHP长任务崩溃解决方案 ...

Windows环境下Apache+PHP长任务崩溃解决方案

呶募妙 6 天前
一、问题概况
上传Excel数据进行计算入库的程序,在执行一次数据量大的Excel时出现。基本的max_execution_time 、memory_limit 都已设置,程序每次执行大约8分钟左右后会出现500的服务器异常(thinkphp框架会跳转出现Error控制器不存在的异常),且无更详细的错误信息与描述。
二、问题分析流程
1、对程序内上传的Excel数据做截断测试(二分),确认程序以及上传文件正常。
2、逐步简化测试程序代码,排查是否某存在单次耗时过长能优化的代码或者SQL查询。经测试未检测出明显耗时和能优化的代码。
3、程序涉及Mysql事务,检查相关错误日志+程序注释事务内数据库操作进行调试(改用sleep()函数模仿),排除长事务导致的异常。
4、调整PHP超时相关基本配置max_execution_time 、memory_limit测试改动后是否有效,测试后无效。
5、经过上面调试,已发现服务器异常时间大约在8分钟左右,继续简化代码超时用sleep()代替,最终调试代码如下:
  1. 1 ini_set('max_execution_time',0); 2 ini_set('memory_limit', '2048M'); 3 sleep(600); 4 echo 1;
复制代码
6、程序使用了框架(Thinkphp),框架外执行调试代码排除框架导致的异常。
7、检查PHP错误日志同时更换PHP新版本测试,排除PHP版本以及配置问题,防止其他更改过的配置导致异常。
8、经上述测试,目标已锁定Apache问题,初始查看Apache日志并无记录明显错误异常。
9、调整Apache错误日志等级原crit(严重)=>debug(调试),最终定位到php-cgi.exe exit(busy timeout), return code 9的异常信息,开始针对Apache的php-cgi相关配置进行了解和调试。
三、最终解决方案
 
  1. 【常规PHP超时配置项】 [php.ini] max_execution_time = 1200 memory_limit = 1024M [代码] ini_set('max_execution_time',0); ini_set('memory_limit', '1024M'); 【Apache httpd.conf相关配置】 # 定义服务器等待客户端请求的最长时间(秒),包括接收请求头和请求体的总时间‌ Timeout 1200 # 启用持久连接,允许同一TCP连接处理多个HTTP请求,减少握手开销‌ KeepAlive On # 控制空闲连接保持时间,超过该时限未活动则断开连接‌ 与Timeout需保持协调关系(建议KeepAliveTimeout ≤ Timeout)‌ KeepAliveTimeout 1200 [核心mod_fcgid相关配置]  # 定义FastCGI进程I/O操作(读写请求/响应数据)的最大超时时间,单位为秒 FcgidIOTimeout 2400 # 强制终止处理请求超过2700秒(45分钟)的FastCGI进程,用于防止脚本无限阻塞 FcgidBusyTimeout 2700 # 控制空闲FastCGI进程的存活时间。600秒后无请求则回收进程 FcgidIdleTimeout 600 # 单个FastCGI进程的最大生命周期(1小时),超时后自动重启以释放潜在内存泄漏 FcgidProcessLifeTime 3600 # FastCGI进程启动或连接的后端服务超时时间(5分钟),仅Windows系统有效。UNIX系统依赖Socket机制无此限制‌ FcgidConnectTimeout 300
复制代码
 
 
 



来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册