一次性调用的数据太大,就会导致php运行超时,继而报错500Internal Server Error的可能,这里分享几种解决方法。
1,清缓存数据
foreach ($data as $k => $v) { $num ++; if ($num == $limit) {//清空内存防止溢出 ob_flush(); flush(); $num = 0; } ....... }
2,分页循环数据
$userCount = D('model')->count(); for($i = 0; $i < ceil($userCount/5000); $i++) { $begin = $i * 5000; $end = ($i + 1) * 5000; $userList = D('model')->field('key_name')->limit($begin,$end)->select(); foreach ($userList as $value) { ... } }
3,添加程序开始部分修改配置文件
ini_set("max_execution_time", "500"); ignore_user_abort(true); set_time_limit(0); ini_set("memory_limit", "-1");
4,修改apache配置文件
找到server/Apache/conf/Fchi.conf文件,把里面的数值调大
<Ifodule fegid modu1e> #此项数值的设置不能小于Fcgi daxRequestsPerProcess FcgidInitia1Env PHP_ FCGI MAX_ REQUESTS 100000 #php-cgi最大请求数设置 Fcgi dllaxRequestsPerProcess 100000 #php-cgi最小请求数设置 Fcgi dMinProcessesPerClass 0 #php-cgi最大请求数设置 Fcgi dllaxProcessesPerC1ass 50000 #php-cgi最大的进程数,内存高的话可以增加此项 Fcgi dllaxProcesses 100000 #空闲超时过程的扫描间隔,与FcgidIdleTimeout对应, 每120秒进行一次检查 Fcgi dIdl eScanInterval 12000 #空闲的F astcgi程序在超过设置的时间后将会被杀死,- 般和上面的F cgidId1 eScanInterva1配合使用 Fcgi dIdleTimeout 12000 Fcgi dProcessLifeTime 36000 #这是Fastcgi模块在win中试图连接-一个应用的时候设置的一 个最大的周期时间,当等待超过了这个时间将会超时 Fcgi dConnectTimeout 18000 Fcgi dBusyTimeout 10000 邯astCGI的服务器通信超时,也就是最大执行时间,设置成900代表与程序通讯的最长时间是15分钟 Fcgi dI0Timeout 18000 #这是CGI输出缓冲区的大小 Fcgi dOutputBufferSize 1024000000 Http请求的最大长度,超过将出现500 Server Error. Fcgi dllaxRequestLen 1024000000 #每个请求保存在内存中的最大尺寸,通常请求体被存储在内存中,超过的部分会存在临时文件。 Fcgi dllaxRequestInllem 1024000000