32位PHP函数filesize获取2GB以上大文件错误解决

09/07/2013

众所周知,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以上大文件。

他提供的代码是:

他在注释中提到:

…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以上大文件大小的最好方案了。