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

标签 php

我试图用 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 字节的长整型定义,为我们提供函数停止处的有符号整数最大值.我没有比这更深入,这是我的假设,考虑到你正在经历的行为,这对我来说就足够了(但对更迂腐的人来说就足够了)。

另一方面,我个人从未使用过readfilefopen/fread 组合在性能和内存使用方面总是表现更好.由于您可以读取 block ,而不是吞噬 2GB 的巨大空间,因此在服务器资源上更容易。

关于php - 如何在 PHP 中下载大于 2Gb 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40744626/

相关文章:

php - Laravel 5.3 资源路由名称

php - SSL目录结构

php - SEO 排除特定文件夹/页面

PHP:似乎无法使用 MySQL 查询日期

php - 如何自动加载具有不同子命名空间的 Controller ?

php - Laravel 5.2 查询构建器插入方法不起作用

php - 如何在数组中插入当前日期

php - 使用表单更新 PHP inc 文件

php - http_build_query 使用参数时出错

php - SQL INSERT 没有错误