解决PHP大文件下载超时中断的方法
PHP大文件下载超时中断的解决方法有以下几种: 1. 修改php.ini文件中的max_execution_time和max_input_time参数,增加执行时间和输入时间。 2. 使用ignore_user_abort()函数来忽略客户端断开连接的情况。 3. 使用ob_flush()函数来清除输出缓冲区,减少内存占用。 4. 使用readfile()函数来读取文件内容并直接输出到浏览器,避免使用fopen()函数打开文件。 5. 使用分块传输编码(chunked transfer encoding)来分段传输文件内容,避免一次性加载整个文件。
<?php//设置脚本的最大执行时间,设置为0则无时间限制set_time_limit(0);ini_set('max_execution_time','0');$file_name='aa.zip';//本机文件地址$extension=pathinfo($file_name)['extension'];$dowload_name='资料.'.$extension;$file_dir="./";//下载文件存放目录//检查文件是否存在if(!file_exists($file_dir.$file_name)){header('HTTP/1.1404NOTFOUND');}else{//以只读和二进制模式打开文件$file=fopen($file_dir.$file_name,"rb");//告诉浏览器这是一个文件流格式的文件Header("Content-type:application/octet-stream;name=$dowload_name");//请求范围的度量单位Header("Accept-Ranges:bytes");Header('Content-Transfer-Encoding:binary');$filesize=filesize($file_dir.$file_name);//$header_array=get_headers($filename,true);(网络文件用这个方式获取大小)//$filesize=$header_array['Content-Length'];//Content-Length是指定包含于请求或响应中数据的字节长度Header("Accept-Length:".$filesize);//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。Header("Content-Disposition:attachment;filename=".basename($dowload_name));//针对大文件,规定每次读取文件的字节数为10000字节,直接输出数据$read_buffer=10000;//读取文件内容并直接输出到浏览器//总的缓冲的字节数$sum_buffer=0;//echofread($file,filesize($file_dir.$file_name));//只要没到文件尾,就一直读取while(!feof($file)&&$sum_buffer<$filesize){echofread($file,$read_buffer);flush();//输出缓冲(切记,没有清楚缓存,下载会中断)ob_flush();$sum_buffer+=$read_buffer;}fclose($file);exit();}
循环时,切记刷新缓存区