首页 > 解决方案 > 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*/

我试图包含任何似乎相关的信息,但如果任何其他信息有用,请告诉我!我还将确保包含处理我在帖子顶部提到的下载过程的当前代码。

标签: phpdownload

解决方案


代替

readfile($file); 
flush();

我会尝试

$handle = fopen($file, 'r');
while (!feof($handle)) {
    echo fread($handle, 8192);
    flush();
}
fclose($handle);

您可能需要调整上述内容以处理正确的编码,但这取决于您的环境


推荐阅读