使用thinkphp6框架时,写一个上传图片的功能,看了一下tp自带的上传,发现tp用的是stream_copy_to_stream(在数据流之间进行复制操作)
因此对比了一下三种复制文件的方法效率
一、move_uploaded_file
// 获取文件
$file=$_FILES['file'];
// 文件接收路径-根据实际使用情况设置
$path="images/";
// 检查文件路径是否存在
if (!file_exists($path)) {
mkdir($path, 0755, true);
}
// 获取图片系统临时路径
$tmp_name = $file['tmp_name'];
// 新的文件名
$new_name = '1.png';
move_uploaded_file($tmp_name,$path . $new_name);
60k的图片
开始时间:"0.99321100 1625645499"
结束结束:"0.99379600 1625645499"
400k的图片
开始时间:"0.71939200 1625645735"
结束时间:"0.72134300 1625645735"
4m的图片
开始时间:"0.19365900 1625647042"
结束时间:"0.22594000 1625647042"
二、file_get_contents
// 把整个文件读入一个字符串中
$f1 = file_get_contents($tmp_name);
// 打开新文件
$f2 = fopen($path.$new_name,'w+');
// 将f1写入新文件中
fwrite($f2, $f1);
// 关闭新文件
fclose($f2);
60k的图片
开始时间:string(21) "0.15345100 1625645546"
结束时间:string(21) "0.15466100 1625645546"
400k的图片
开始时间:string(21) "0.16768800 1625645757"
结束时间:string(21) "0.16928200 1625645757"
4m的图片
开始时间:string(21) "0.16831100 1625647079"
结束时间:string(21) "0.20398100 1625647079"
三、stream_copy_to_stream
// 把整个文件读入一个字符串中
$f1 = fopen($tmp_name,'r');
// 打开新文件
$f2 = fopen($path.$new_name,'w+');
// 将f1写入新文件中
stream_copy_to_stream($f1,$f2);
// 关闭文件
fclose($f1);
fclose($f2);
60k的图片
开始时间:string(21) "0.89008800 1625645568"
结束时间:string(21) "0.89073700 1625645568"
400k的图片
开始时间:string(21) "0.60109300 1625645791"
结束时间:string(21) "0.60235100 1625645791"
4m的图片
开始时间:string(21) "0.20404400 1625647079"
结束时间:string(21) "0.21407500 1625647079"
最后对比stream_copy_to_stream的效率会好一点,至于三种方法那种更好也每个标准,看实际使用更适合什么了。要是有大佬对php数据流有研究的话欢迎指导。