PHP大文件下载的奇怪问题

yktd26 2012-11-08 07:50:43
我们有个项目服务端是php来实现文件下载,大体的代码是


$filePath = getfilepath(); //absolute
header('Content-type: application/octet-stream;');
header('Content-Disposition: attachment; filename="' . utf8_decode($fileName) . '"');
$size = getfilesize();//return string
header('Content-length: ' . $size);
if ($fd = fopen($filePath, 'rb')) {
session_write_close();
while (!feof($fd)) {
print (fread($fd, 65535));
}
fclose($fd);
}


在其中几个服务器上运行正常, 但是在其中一个win server 2008如果文件大于2.09G(int的最大值),服务端只发2.09G,有没有遇到这种问题的?不知道是php还是apache还是Windows
...全文
141 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
acabin 2012-11-09
  • 打赏
  • 举报
回复
x-accel的好处是可以先通过php判断,例如请求合法性之类的,然后隐藏地址返回文件,同时php关闭,由前端服务器处理文件分发 既做到了控制也做到了节省资源
yktd26 2012-11-08
  • 打赏
  • 举报
回复
引用 3 楼 acabin 的回复:
你的getfilesize是不是对filesize的重载? 如果是的话,filesize是返回int的; 可能是你的php是32位编译的,你需要一个64位的版本
谢谢啦,那行是个伪代码,filesize是个string,是用 stat -c%s 生成的, 最后终于找到原因了,是个php的bug,换了个版本好了... 如果感兴趣 这是对这个bug的个patch https://bugs.php.net/patch-display.php?bug_id=52679&patch=big-content-length.patch&revision=latest 不过还是多谢了,结贴了 PS 而且看了看x-accel是个好东西,也支持proxy_pass,不知道对比mod_proxy有什么优劣? 我们在另一个地方可能需要个proxy的module,因为你知道safari默认禁止第三方cookie,真蛋疼
acabin 2012-11-08
  • 打赏
  • 举报
回复
你的getfilesize是不是对filesize的重载? 如果是的话,filesize是返回int的; 可能是你的php是32位编译的,你需要一个64位的版本
yktd26 2012-11-08
  • 打赏
  • 举报
回复
引用 1 楼 acabin 的回复:
你这个写法太惨烈了 如果一个客户网速很慢,那是不是你的php就要一直跟着跑? php执行上限是不是就不能设了? 万一断了是不是就不能续传了? 所以别这样用php,用x-accel或者其他方案吧
谢谢你的回复,没太明白这是服务端发送,这里客户端的速度是不是没关系啊, php执行上限在发送之前都设置了set_time_limit(0); 断了续传用HTTP_RANGE来判断要seek多少 确实这种做法不好,不过这次只是想弄明白 为什么Content-Length里明明写了3G多,客户端只能收到2G
acabin 2012-11-08
  • 打赏
  • 举报
回复
你这个写法太惨烈了 如果一个客户网速很慢,那是不是你的php就要一直跟着跑? php执行上限是不是就不能设了? 万一断了是不是就不能续传了? 所以别这样用php,用x-accel或者其他方案吧

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧