Home  >  Article  >  Backend Development  >  Why downloading php file fails

Why downloading php file fails

藏色散人
藏色散人Original
2020-09-11 10:03:254333browse

The failure to download the php file is because when readfile reads the file, it will put the file into the cache, causing memory overflow. The solution is to implement segmented download and limit the download speed.

Why downloading php file fails

Recommended: "PHP Video Tutorial"

Solve PHP failure to download large files and limit downloads Speed

1. Problem:

When PHP uses the readfile function to define a download file, the file cannot be too large, otherwise the download will fail, the file will be damaged, and no error will be reported;

2. Reason:

This is because when readfile reads the file, it will put the file into the cache, causing memory overflow;

3. Solution: Download in segments and limit downloads Speed;

<?php
//设置文件最长执行时间
set_time_limit(0);
if (isset($_GET[&#39;filename&#39;]) && !empty($_GET[&#39;filename&#39;])) {
    $file_name = $_GET[&#39;filename&#39;];
    $file = __DIR__ . &#39;/assets/&#39; . $file_name;
} else {
    echo &#39;what are your searching for?&#39;;
    exit();
}
if (file_exists($file) && is_file($file)) {
    $filesize = filesize($file);
    header(&#39;Content-Description: File Transfer&#39;);
    header(&#39;Content-Type: application/octet-stream&#39;);
    header(&#39;Content-Transfer-Encoding: binary&#39;);
    header(&#39;Accept-Ranges: bytes&#39;);
    header(&#39;Expires: 0&#39;);
    header(&#39;Cache-Control: must-revalidate&#39;);
    header(&#39;Pragma: public&#39;);
    header(&#39;Content-Length: &#39; . $filesize);
    header(&#39;Content-Disposition: attachment; filename=&#39; . $file_name);
    // 打开文件
    $fp = fopen($file, &#39;rb&#39;);
    // 设置指针位置
    fseek($fp, 0);
    // 开启缓冲区
    ob_start();
    // 分段读取文件
    while (!feof($fp)) {
        $chunk_size = 1024 * 1024 * 2; // 2MB
        echo fread($fp, $chunk_size);
        ob_flush(); // 刷新PHP缓冲区到Web服务器
        flush(); // 刷新Web服务器缓冲区到浏览器
        sleep(1); // 每1秒 下载 2 MB
    }
    // 关闭缓冲区
    ob_end_clean();
    fclose($fp);
} else {
    echo &#39;file not exists or has been removed!&#39;;
}
exit();

The above is the detailed content of Why downloading php file fails. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn