一次性调用的数据太大,就会导致php运行超时,继而报错500Internal Server Error的可能,这里分享几种解决方法。
1,清缓存数据
1
2
3
4
5
6
7
8
9
|
foreach ( $data as $k => $v ) {
$num ++;
if ( $num == $limit ) { //清空内存防止溢出
ob_flush();
flush ();
$num = 0;
}
.......
}
|
2,分页循环数据
1
2
3
4
5
6
7
8
9
|
$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,添加程序开始部分修改配置文件
1
2
3
4
|
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文件,把里面的数值调大
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<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
|