如何在PHP中下载大于2Gb的文件?

我正在尝试用
PHP编写一个下载大型zip文件(2,663,439,370字节)的脚本,我遇到了一个有趣但令人沮丧的问题:脚本下载了第一个2.147.483.647字节,然后继续下载文件,而不是附加到它的字节数为2.147.483.648,2.147.483.649等,它继续将字节附加到从字节编号1开始的文件中.

因此,下载的文件由以下部分组成:字节1,字节2,…字节2.147.483.647,字节1,字节2 ……等等.

我注意到2.147.483.647是32字节系统可以存储的最大整数值.但是,我的服务器是一个64字节的系统,可以存储大于该值的值.为了证明这一点,var_dump((int)2147483648)返回正确的整数.

我的下载脚本尽可能正确(通过copy-paste从php.net获取)

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="Certificat.zip"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($zipname));    

readfile($zipname);

有人遇到过这个问题吗?

最佳答案 读取5.6源文件,readfile返回RETURN_LONG(大小).
Here’s the source reference.

进一步挖掘,看起来这个宏处理long int定义,通常是4个字节,给出了函数停止时整数的有符号最大值.我没有比这更深入,这是我的假设,并且考虑到你正在经历的行为,这对我来说已经足够了(但不适合更迂腐的人).

另一方面,我个人从未使用过readfile,fopen / fread组合在性能和内存方面总是被证明更好.既然你可以阅读块,而不是吞噬2GB的猛犸象,那么服务器资源就更容易了.

点赞