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

博主在尝试使用PHP下载2.663亿字节的zip文件时遇到问题,脚本在达到32位系统最大整数2.147.483.647字节后,不是继续追加而是重新从头开始。尽管服务器是64位,但readfile()函数似乎受32位限制影响。解决方案建议使用fopen/fread组合按块读取大文件,以减轻服务器资源负担。
摘要由CSDN通过智能技术生成

我正在尝试用

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的猛犸象,那么服务器资源就更容易了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值