欢迎光临 - 我的站长站,本站所有资源仅供学习与参考,禁止用于商业用途或从事违法行为!

php教程

数据太大导致php运行超时报错500Internal Server Error

php教程 我的站长站 2023-03-18 共62人阅读

一次性调用的数据太大,就会导致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