最近在做一个媒体管理的工具,在利用PHP进行文件大小统计的时候,出现超过2G的文件,数据统计错误。
我们先通过我们的简单的代码来看下出现的问题是什么:文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
首先我们准备了一个2.08G的文件:文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
然后我们利用下面的PHP代码进行分析(代码随便写的,只是为了测试):文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
function s($fsize){ $unit = $fsize>pow(1024,3) ? array(3,"G") : ($fsize>pow(1024,2) ? array(2,"MB") : array(1,"KB")); return round($fsize/(pow(1024,$unit[0])),3).$unit[1]; } $dirName = 'K:\VIDEO\HD\3840X2160\[V00232]4K x 2K Original Makeup your world_100mbps.mp4'; echo s($fsize = sprintf("%u", (int)filesize($dirName))); echo "<hr />"; echo s($fsize = (int)filesize($dirName));
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
看下执行的结果:文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
文章源自陈学虎-https://chenxuehu.com/article/2016/08/5540.html
通过代码发现,加了
sprintf("%u", filesize($file))
代码的,就能正常的解析正确数据了,为啥呢?
因为 PHP 的整数类型是有符号的,并且大多数平台使用 32 位整数,filesize() 函数在碰到大于 2GB 的文件时可能会返回非预期的结果。对于 2GB 到 4GB 之间的文件通常可以使用 sprintf("%u", filesize($file)) 来克服此问题。
评论