fread 的下载速度比 readfile 慢很多

2023-12-05

我通过 PHP 脚本从 URL 向用户提供下载服务。使用时readfile()我得到了我的连接可以支持的最大下载速度(大约 2.5MB/s),但是当我使用fopen, fread, fclose路线下载速度非常非常慢(大约1-2KB/s)。

这是我的代码:

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

$file = fopen($url, 'rb');

while(!feof($file)) {
    echo fread($file, 2014);
}

读取文件的代码很简单readfile($link);.

我不能只使用readfile()功能有两个原因,一是我想限制用户的下载速度(我可以用fread通过只读取这么多数据),我还想跟踪用户下载了多少(我可以用readfile()但不计算部分下载)。

有谁知道为什么会发生这种情况或者我该如何解决它?据我所知readfile()只是一个包装fopen, fread and fclose所以我不明白出了什么问题。

编辑:最终选择了 cURL。

$curl = curl_init();
$options = array(
    CURLOPT_URL => $rdLink,
    CURLOPT_FAILONERROR => true,
    CURLOPT_BINARYTRANSFER => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_WRITEFUNCTION => 'readResponse'
);
curl_setopt_array($curl, $options);

if(!curl_exec($curl)) {
    header('Location: http://whatever.com');
    exit;
}
curl_close($curl);

function readResponse($ch, $data) {
    $length = mb_strlen($data, '8bit');

    echo $data;

    return $length;
}

Use 流上下文创建() and Stream_get_contents()

$context = stream_context_create();
$file = fopen($url, 'rb', FALSE, $context);
while(!feof($file))
{
    //usleep(1000000);
    echo stream_get_contents($file, 2014);
}

您还可以尝试增大文件读取长度并放入 usleep() 来减慢执行速度。 无论如何,对于最新版本的 PHP 来说,流函数似乎比 fread 更推荐。 您可能还想在 fread() 或 stream_get_contents() 前面添加一个 @ 以抑制任何错误,至少在生产中是这样。如果没有它,稍有意外,你的文件就会损坏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fread 的下载速度比 readfile 慢很多 的相关文章

  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • PHP - 扩展 __construct

    我想知道你是否可以帮助我 我有两个类 一个扩展了另一个 B 类将由各种不同的对象扩展 并用于常见的数据库交互 现在我希望 B 类能够处理其连接和断开连接 而无需来自 A 类或任何外部输入的指示 据我了解 问题是扩展类不会自动运行其 cons
  • PHPUnit\Framework\TestCase 和 Tests\TestCase 有什么区别?

    我注意到在示例测试中 这两个类是内置的 功能测试 gt use Tests TestCase 单元测试 gt PHPUnit Framework TestCase 两者有什么区别 在什么情况下您会使用其中一种 PHPUnit Framewo
  • 包含包含文件的 php 文件

    这是目录结构 global php includes class bootstrap php includes init php plugins myplugin php 这是这些文件中的代码 start php require inclu
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 如何在 Twitter Card 中传递动态图像路径?

    我在用
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • 下载 csv 文件 node.js

    我正在使用 node js 构建一个应用程序并尝试将数据下载为 csv 文件 我正在使用 json2csv https www npmjs com package json2csv https www npmjs com package j
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • wordpress - 像 stackoverflow 中那样内嵌 ajax 注释

    我有一个 WordPress 博客 希望为人们提供与 stackoverflow 中添加评论相同的用户体验 有很多评论 ajax 插件 但我找不到一个可以使用的插件 它允许您在主页上内联 进入并添加评论 而无需先深入到单独的单个帖子页面 任
  • 使用 fopen() 包装器创建 ZIP 文件

    如何使用以下命令创建 ZIP 文件fopen 包装器 http es php net manual en wrappers compression php 这显然是not道路
  • 使用 PHP 和 OAuth 访问 SkyDrive

    我想使用 PHP 访问 skyDrive 我想检索文件和文件夹列表 下载 上传和删除文件 我有一个 microsoft dev clientID 和 clientSecret 有人可以帮助我开始使用 OAuth 连接到 skyDrive 并
  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 谷歌日历手表过期时间超过1个月怎么办?

    我将我的 CRM 系统与 Google 日历同步 为此 我要求push notifications从我的用户 Google 日历到我的系统 我已经成功创建了手表 并将过期时间设置为2030年 但是当我收到手表事件的响应时 它显示手表的过期时
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records

随机推荐

  • jQuery:.click() 和 .on("click") 之间的区别

    我通常使用 selector click 但有些人建议我改用这个 selector on click function Or selector live click 已弃用 我读了说明书 但我初学者的头脑无法理解 我对他们使用的所有术语感到
  • 微电网电池调度的约束优化

    给定电力消耗 太阳能电池板发电 价格等输入 全部在给定时间 t 我们有一个电池 我们想要评估它在任何给定时间应该 放电 充电多少 该问题可以表述如下 Pt price of electricity at time t Lt consumpt
  • 多次调用 imageWithData:UIImageJPEGRepresentation() 仅第一次压缩图像

    为了防止我的应用程序出现滞后 我尝试压缩大于 1 MB 的图像 主要是从 iPhone 的普通相机拍摄的照片 UIImage image info objectForKey UIImagePickerControllerOriginalIm
  • 使用 swift 获取 HTTP 状态

    很抱歉 我还没有找到我的问题的答案 请不要太严厉 我不是专业程序员 但我不断学习 希望一旦我能够回答别人的问题 我正在尝试获取链接的 HTTP 状态 我根据一个数据库条目代码生成链接 例如 ABCDEF 我将它们保存在一个数组中 然后生成指
  • 什么布局管理器会执行此操作?

    OY 没有足够的代表点来发布图像 joes pizza pizza type toppings cheese mushrooms 15 00 veggie extra cheese p
  • Rollup、Vue 和 Buble、scss 文件中出现意外标记

    我正在尝试使用 Vue 和 Buble 按照 Vue 官方页面中提供的示例 使用 rollup 来编译 SFC 但我不断收到此错误 src wrapper js dist chat min js plugin buble SyntaxErr
  • 在 WPF 中缓慢平移和缩放

    我在 WPF 的几块画布上绘制了大量的线条和文本 我在 WPF 中使用了最轻量级的元素 DrawingVisual 我在不同的画布上画了线 并绑定了它们thickness为缩放系数的倒数 这样我可以在缩放时获得均匀的线条粗细 这意味着当我缩
  • 正则表达式中的否定字符[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我如何编写符合以下条件的正则表达式 没有数字 没有特殊字符 没有空间 在一个字符串中 字符类 中的插入符号是大多数正则表达式实现 Perl NET Ruby Javascript 等
  • VB6 应用时序

    我正在尝试分析 VB6 应用程序 基本上我想在方法级别计算出执行花费了多少时间 然而VB6只支持1秒的时间 有什么好的方法可以计算出毫秒等吗 虽然MSDNsays Timer仅精确到1秒 我发现它比实践中的要好 获取刻度数通常准确到abou
  • 将 C“FOR”循环转换为 Delphi

    我正在尝试将 FOR 循环从 C 转换为 Delphi 但我有一些疑问 我知道 C 中的这段代码 for i 0 i lt mb gt size i 在Delphi中是这样的 for i 0 to mb size do begin end
  • 在 AngularJS ng-repeat 中对集合进行分组?

    我有一个非常简单的场景 其中有一组记录可用 我需要以简单的 ng repeat 方式显示它们 但是 我需要按属性对记录进行分组 并且我的目标不是不必更改集合即可完成此分组 我的想法是可以应用某种类型的过滤器 但在实践中过滤器 很好地过滤数据
  • 如何创建一个函数来计算每个元素等于其右侧 2 个元素的次数

    我知道我需要使用列表理解 但我一生都无法弄清楚表示这一点的正确方法是什么 此运行权的一个示例是 晚上 一次输出为 2 代表 e 一次代表 n 列表推导式将具有相同字母的字母放在右侧两个位置 我们只需计算结果列表的长度 s evening a
  • 在 shell 脚本中使用 passwd 命令

    我正在编写一个 shell 脚本来自动添加新用户并更新其密码 我不知道如何让 passwd 从 shell 脚本中读取 而不是以交互方式提示我输入新密码 我的代码如下 adduser 1 passwd 1 2 2 from man 1 pa
  • 在 UIActivityViewController 中与不同类型共享数据

    以下帖子提出了一个极其相似的问题 UIActivityViewController 中共享提供程序的不同数据 但我的问题不同 我知道如何通过使用与不同的活动共享相同类型的不同数据itemForActivityType 例如 id activ
  • List 上的 UISelectMany 导致 java.lang.ClassCastException:java.lang.String 无法转换为 T

    我在用
  • 使用 C#/Linq 累加序列的子序列

    我试图根据以下要求找到一种更好的方法来处理数字序列 的价值sequence i 是其自身价值加上累积的总和sequence 0 to sequence i 1 例如 如果序列是一个列表 List
  • ServiceStack:测试 OrmLite,与 NuGet 一起安装,但出现错误“FileNotFoundException”

    我刚刚在 Visual Studio 2012 中通过 NuGet 安装了 OrmLite 适用于 MySql 安装顺利通过 没有任何错误 并且所有 DLL s 似乎都已添加作为参考 服务栈 Common 3 9 70 0 ServiceS
  • 在 iPhone 上使用 Objective-C 的 HTTP POST 和 GET 教程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我下载了苹果使用 HTTP POST 和 GET 的演示 他们的示例应用程序有一个包含不同部分的选项卡栏 代码非常混乱 有人能给我一些示例代码或一些相关教程的链接吗 Thanks M
  • 在Python中使用Requests搜索网站时出现502错误

    使用一个非常基本的程序在网站上搜索查询并打印搜索结果 为什么会收到 502 错误 import requests from bs4 import BeautifulSoup import re def main url https www
  • fread 的下载速度比 readfile 慢很多

    我通过 PHP 脚本从 URL 向用户提供下载服务 使用时readfile 我得到了我的连接可以支持的最大下载速度 大约 2 5MB s 但是当我使用fopen fread fclose路线下载速度非常非常慢 大约1 2KB s 这是我的代