PHP 下载 file_put_contents vs readfile

通过对比file_put_contents与readfile函数在不同大小文件下载时的内存消耗及耗时情况,发现readfile更适用于大文件下载,能有效避免PHP内存溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set_time_limit(0);
ini_set('memory_limit', '512M');


//获取当前时间
function getTime($convert = true)
{


    return microtime($convert);
}


//获取当前内存
function memory()
{


    return memory_get_usage();
}




$m = memory();
$s = getTime();
$file = file_get_contents("a.zip", true);
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: " . filesize('a.zip'));
header('Content-Disposition: attachment; filename="a.zip"');
echo $file;




error_log('file_put_contents:         内存:'.(memory()-$m).',耗时:'.(getTime()-$s).'\r\n',3,'D:/1.txt');


/* readfile() benchmark */




$m = memory();
$s = getTime();
ob_start();
header('Content-Type: application/octet-stream');
header("Accept-Ranges: bytes");
header("Accept-Length: " . filesize('a.zip'));
header('Content-Disposition: attachment; filename="a.zip"');
header('Content-Transfer-Encoding: binary');
readfile('a.zip');
ob_end_clean();




error_log('readfile:         内存:'.(memory()-$m).',耗时:'.(getTime()-$s).'\r\n',3,'D:/1.txt');


结果如下:

2k文件
file_put_contents:         内存:2304,耗时:0.00099992752075195
readfile:                  内存:888,耗时: 0.002000093460083


20M文件
file_put_contents:         内存:50126256,耗时:0.21602201461792
readfile:                  内存:896,耗时:0.071007013320923


153M文件
file_put_contents:         内存:321370872,耗时:1.0341031551361
readfile:                  内存:840,耗时:1.9421939849854


结论:相同条件下在下载大文件时使用readfile更省内存,不容易导致php内存溢出问题。

、填空题 1、使用fopen()函数打开文件后,返回值是(resource)数据类型。 2、file_put_contents()函数要实现追加写入,第3个参数应设为(FILE_APPEND)。 3、若要禁止打开远程文件,可以使用php.ini中的(allow_url_fopen)配置项来设置。 4、在PHP中,使用(filemtime(string $filename))获取文件的修改时间。 5、在PHP中,若要实现文件下载,需将header()函数中Content-Disposition的值设为(attachment)。 二、判断题 1、在PHP中,dirname()函数用于返回路径中的目录部分。(√) 2、php.ini中的open_basedir无法限制include()函数的访问路径。(×)(可以限制) 3、file_get_contents()函数支持访问远程文件。(√) 4、语句"rmdir(‘path1/path2’)“的执行目的就是递归删除path2和path1。(×)(删除非空目录时,会删除失败) 5、在遍历任何目录时,返回值中都会包括”.“和”…"这两个特殊的目录。(×)(根目录不可) 三、选择题 1、PHP中用于判断文件是否存在的函数是(B)。 A、fileinfo() B、file_exists() C、fileperms() D、filesize() 2、fileatime()函数能够获取的文件属性是(C)。 A、创建时间 B、修改时间 C、上次访问时间 D、文件大小 3、下列选项中,可以实现将一个文件复制到另一个文件或目录下的函数是(D)。 A、rename() B、move_uploaded_file() C、link() D、copy() 4、下列选项中,可以删除文件的函数是(B)。 A、rename() B、unlink() C、rmdir() D、fclose() 5、下列选项中,可以将文件中的内容读入数组中的函数是(A)。 A、file() B、fgets() C、file_get_contents() D、fgetc() 四、简答题 1、请列举5个常用的文件操作函数 函数 功能 int filesize(string $filename) 获取文件大小 int filectime(string $filename) 获取文件的创建时间 int filemtime(string $filename) 获取文件的修改时间 int fileatime(string $filename) 获取文件的上次访问时间 bool is_readable(string $filename) 判断给定文件是否可读 bool is_writable(string $filename) 判断给定文件是否可写 bool is_executable(string $filename) 判断给定文件是否可执行 array stat(string $filename) 获取文件的信息 2、请简要说出超全局变量$_FLES获取上传文件信息后,各个元素键名及其作用 答:(1)name:表示文件名,是用户上传的文件在服务器上的名称。 (2)type:表示文件的MIME类型。 (3)tmp_name:表示临时文件路径,是服务器上存储上传文件的临时路径。 (4)error:表示错误代码,是一个整数值,表示上传过程中可能发生的错误。可能的错误代码包括但不限于:UPLOAD_ERR_OK(无错误)、UPLOAD_ERR_INI_SIZE(临时文件大小超过了php.ini中的设置)、UPLOAD_ERR_FORM_SIZE(表单大小超过了表单限制)、UPLOAD_ERR_PARTIAL(文件部分上传失败)等。 (5)size:表示文件大小(字节数)。 (6)headers:表示一个包含HTTP头信息的关联数组,当文件正在通过浏览器进行上传时有效。帮我记忆
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值