<?php
// 取消最大请求时间限制
set_time_limit(0);
// 调整最大内存限制:filesize()最大可正确读取2G文件,即2048M
ini_set('memory_limit', '2048M');
// 定义字节单位
define('UNITS', ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'ZB', 'YB', 'DB', 'NB']);
/**
* 读取文件的真实字节数
* @param string $file 文件路径
* @return int
*/
function realsize(string $file){
$file = fopen($file, 'r');
$size = 0;
// 内部数字是内存为'2048M'时的允许的字节数
while (!feof($file)) $size += strlen(fread($file, 0x20000000));
fclose($file);
return $size;
}
/**
* 在Windows系统中使用命令获取文件大小
* 【注意】个人在Win10x64系统中测试为:11.4G的单文件大小耗时为0.067~0.165s
* 【注意】如果存在不能获取到的情况,请各位根据执行命令后的数据做出兼容调整
* 【优点】大文件时远比分流读取快速、不用调整内存大小
* @param string $file 文件路径
* @return string 正整数
*/
function realsizeByWindows(string $file){
$data = [];
// 在路径两边加双引号是防止空格字符的影响
exec('dir /s "' . strtr($file, '/', '\\').'"', $data);
foreach ($data as $v) {
$v = trim($v);
if (substr($v, 0, 9) === '1 File(s)') {
preg_match('/\d+/', str_replace(',', '', substr($v, 9)), $m);
return $m[0];
}
}
}
/**
* 按数字转为对应的字节单位
* @param string $size 字节数量
* @param integer $length 保留的小数位数
* @return string
*/
function unit(string $size, int $length = 0){
foreach (UNITS as $v) {
if ($size >= 1024) $size = bcdiv($size, '1024', $length);
else break;
}
return $size . $v;
}
【注意】
1.部分浏览器有最大请求时间限制,会导致"set_time_limit(0)"无效,所以建议在命令窗口中执行,执行方法为:将"php.exe"的文件路径写入到系统的环境变量"path"中,然后打开命令窗口,输入"php php的文件路径",例如:"php C:\www\test.php"。
2.获取文件真实大小均可采用命令行获取的方式。已知windows系统中为=dir /s "文件路径",且文件路径分隔符必须是"\"。其它运行环境请自行测试!