今天码PHP的时候碰到一个很蛋疼的问题,我在做文件床路由模块的时候测试用php输出文件下载,但是很大的文件永远下载不完整,浏览器只会下几百M然后就结束了。
于是我开始从文件输出部分开始一步步往回推,到最后发现原来是服务器告诉浏览器这个文件只有这么大,于是浏览器接收了这么多字节后就关闭连接了。
接着我就开始filesize各种大小的文件,发现大于4G的文件都会出现这样的情况,于是我就去php.net逛了一下,只见这血淋淋的一幕
Note: Because PHP’s integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.
注意:因为PHP的整数类型是有符号整数并且很多平台还他喵的在用32位整数,一些文件系统相关的函数作用在大于2GB文件时可能返回感天动地的结果。
我只想说————————————坑爹呢这是!你都那么多代了这个函数还不升级一下简直有病吧!
虽然它说2GB以上会有问题,不过我测试2GB多文件的时候不知为什么没问题,不过4GB以上的文件就变几百M了。
再于是我就接着在刚刚的页面往下翻,看到了各种各样解决大文件的贡献代码,有一个是这么写的
function getSize($file) { $size = filesize($file); if ($size < 0) if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) $size = trim(`stat -c%s $file`); else{ $fsobj = new COM("Scripting.FileSystemObject"); $f = $fsobj->GetFile($file); $size = $file->Size; //这里是不是写错了啊 } return $size; }
我测试了一下好像没起作用,而且调用一个外部模块好像开销有点大,于是我把这个函数改了一下
function filesizeX($path){//超级文件大小获取函数,解决4G以上文件读取错误文件大小 if(!((strtoupper(substr(PHP_OS,0,3))=="WIN"))){//如果不是windows系统,尝试使用stat命令 $size=trim(`stat -c%s $path`); }else{//如果是windows系统,尝试cmd命令 $filename=basename($path); $cmd="dir ".dirname($path);//尼玛windows竟然没有查看文件属性的命令,只能列出所有文件再用正则提出来了 if(preg_match("/([^\s]+)\s".$filename."\n/", `$cmd`,$match)){ return str_replace(",", "", $match[1]); }else{ return false; } } return (int)$size;//为什么这时候的int就是正常的,官方你怎么说 }
这样就可以正确获取文件大小了,只不过这么做在windows下如果目录里文件很多的话好像也有点废资源,不过大多数服务器还是跑在linux上吧눈_눈,凑活一下能用就好了。。。
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
请问博主的代码如何使用?找遍整个百度了就找到你在豆瓣发的帖子再进来了
填文件路径进去返回文件大小
另外我似乎没在豆瓣上发过东西诶。。。
不一样的滋味一样的心情(申博娱乐城管理网) vip.sunbetshenbo.com
不一样的滋味一样的心情(菲律宾太阳城娱乐网) sunbetshenbo.net
哈哈,下面那个文字
都是我满满的爱(hen)