我试图用 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 字节系统,可以存储大于 64 字节的值。为了证明这一点,var_dump((int) 2147483648) 返回正确的整数。
我的下载脚本尽可能正确(通过复制粘贴从 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(size)
。 Here's the source reference .
进一步挖掘,似乎这个宏处理通常 4 字节的长整型定义,为我们提供函数停止处的有符号整数最大值.我没有比这更深入,这是我的假设,考虑到你正在经历的行为,这对我来说就足够了(但对更迂腐的人来说就足够了)。
另一方面,我个人从未使用过readfile
,fopen
/fread
组合在性能和内存使用方面总是表现更好.由于您可以读取 block ,而不是吞噬 2GB 的巨大空间,因此在服务器资源上更容易。
关于php - 如何在 PHP 中下载大于 2Gb 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40744626/