Maison  >  Article  >  développement back-end  >  Pourquoi n'a-t-il pas réussi à télécharger le fichier php

Pourquoi n'a-t-il pas réussi à télécharger le fichier php

藏色散人
藏色散人original
2020-09-11 10:03:254368parcourir

La raison de l'échec du téléchargement du fichier php est que lorsque readfile lit le fichier, il placera le fichier dans le cache, provoquant un débordement de mémoire. La solution consiste à implémenter un téléchargement segmenté et à limiter la vitesse de téléchargement.

Pourquoi n'a-t-il pas réussi à télécharger le fichier php

Recommandé : "Tutoriel vidéo PHP"

Résoudre l'échec de PHP lors du téléchargement de fichiers volumineux et limiter les téléchargements Vitesse

1. Problème :

Lorsque PHP utilise la fonction readfile pour définir un fichier à télécharger, le fichier ne peut pas être trop volumineux, sinon le téléchargement échouera, le fichier échouera. être endommagé et aucune erreur ne sera signalée ;

2. Raison :

En effet, lorsque readfile lit le fichier, il le placera dans le cache, provoquant un débordement de mémoire

3. Solution : Téléchargez par segments et limitez la vitesse de téléchargement

<?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();

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn