php - PHP 下载问题:连接速度慢时不成功
问题描述
我已经被这个问题困扰了几天,还没有找到解决我遇到的问题的解决方案。
我正在尝试做的事情:
我正在尝试使用 PHP 下载 PDF,并且该代码对于可以在大约一分半钟内下载的文件非常有效。在我家的 wifi 上,我可以在 10 秒内下载一个 159MB 的文件,而且每次都能正常工作。但是当我将网速限制为“Fast 3G”(大约 170KB/s,以模拟较慢的办公速度)时,下载失败。几乎每次,它都会在下载过程的 3 分 24 秒内完成,但偶尔会是 1 分 57 秒的较短时间。
我试过的:
我已经调整了 php.ini 文件(将 max_execution_time = 0 和 memory_limit 设置为比最初配置的 128M 更高的间隔)
我尝试了其他似乎可以“分块”较大 PDF 的下载方法。这主要是不成功的。在一种情况下,下载会完成,但在尝试打开 PDF 时会出错。根据这个解决方案的海报,它只是 UTF-8 编码文件的有效解决方案,我发现我正在处理的是 UTF-16。(我相信这是与 print() 函数的某种不兼容。
如果在 URL 中使用直接链接,我已确保文件可以下载。这种方式没有问题,但它只是为了测试而完成的,并且不能成为永久的解决方案,因为我正在处理的 PDF 包含敏感信息。所以基于这个结果,我至少能够将问题缩小到与 PHP 相关而不是 IIS。
这是我正在使用的当前代码
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/download");
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header("Content-Transfer-Encoding: binary ");
header('Content-Length: ' . filesize($file));
//$file is a full path to the PDF
while(ob_get_level()) {
ob_end_clean();
}
readfile($file);
flush();
exit;
/*I realize it may be off, but it is at least working for quicker load
times as it currently is, so I'm leaving it alone for now*/
我试图包含任何似乎相关的信息,但如果任何其他信息有用,请告诉我!我还将确保包含处理我在帖子顶部提到的下载过程的当前代码。
解决方案
代替
readfile($file);
flush();
我会尝试
$handle = fopen($file, 'r');
while (!feof($handle)) {
echo fread($handle, 8192);
flush();
}
fclose($handle);
您可能需要调整上述内容以处理正确的编码,但这取决于您的环境
推荐阅读
- python - 在模型编译之前/之后使用“conv_base.trainable = False”的模型差异
- bison - 在函数“yyparse”中:y.tab.c:未定义对“ex”的引用
- java - 必要时折叠对象列表的最佳解决方案
- java - 在多个 jar 中外部化类
- python - 使用 mplcursors.cursor().connect() 显示栏名称
- javascript - 为什么我的 HTML 按钮在尝试切换到网页的不同部分时不起作用?
- javascript - 你如何获得 showDirectoryPicker(); 从文件系统访问 Api 到即使您将 dirHandle 存储在 IndexDB 中也不会请求许可
- javascript - 如何在标题中插入特殊脚本?
- python - 将事件流式传输到大查询 - 数据流 - 将 **epoch 时间戳** (int) 插入时间戳列的最佳方式
- bash - AWK 错误参数超出范围?如何解决这个问题呢?