32位PHP函数filesize获取2GB以上大文件错误解决
众所周知,32位的PHP函数filesize无法有效获取2GB以上大文件的文件大小,的确在古老的年代里,人们应该还没有考虑到某天会需要使用PHP读取一个2GB以上的大文件。在PHP手册中就写明了:
因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果。
不过这个巧事却被Kaijia遇上了。这几天Kaijia在写一个使用百度网盘API的服务器数据备份工具(因为百度提供了PHP SDK,所以Kaijia使用了php-cli来运行此程序),由于百度网盘限制通过API上传2GB以上的大文件,所以上传大文件需要将文件分割,当然分割之前需要判断文件是否超过2GB,而这时却遇到了问题:PHP自带的filesize函数在遇到2~4GB大小的文件时返回了负数。导致上传经常出错。于是Kaijia Google了一下,找到了很多种方法,但是都存在缺陷,部分文件大小仍然无法正常读取。最后Kaijia通过Stack Overflow给出的一个失效链接导引回PHP手册找到了一个有效的办法。
jason dot whitehead dot tas at gmail dot com在PHP手册filesize函数页面下发表的一篇评论可以有效解决不同平台下读取4GB以上大文件。
他提供的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php 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 = $fsobj->Size; } return $size; } ?> |
他在注释中提到:
…using parts of code from kaspernj at gmail dot com and md2perpe at gmail dot com, which should get file sizes > 4GB on Windows, Linux and Mac (at least)
经过Kaijia测试,这个方法在32位的Ubuntu系统下是非常有效可用的,相信是目前Kaijia看到的解决32位PHP函数获取2GB以上大文件大小的最好方案了。
怪不得我刚刚写php文件路由的时候用filesize获取4点几G文件返回的都是几百兆
话说你确定第十行没写错嘛。。file还是f
。。的确是的,这段函数是直接从PHP手册的留言中复制过来的。谢谢指出啦~
执行操作符`在安全模式下不能使用。。。而且写程序应该避开这个。。。