Maison > développement back-end > Problème PHP > 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

藏色散人
Libérer: 2023-03-05 20:18:01
original
4432 Les gens l'ont consulté

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();
Copier après la connexion

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal