Maison >développement back-end >tutoriel php >Comment puis-je diffuser efficacement des fichiers volumineux en PHP pour éviter l'épuisement de la mémoire ?

Comment puis-je diffuser efficacement des fichiers volumineux en PHP pour éviter l'épuisement de la mémoire ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 14:38:15478parcourir

How Can I Efficiently Stream Large Files in PHP to Avoid Memory Exhaustion?

Diffusion de fichiers volumineux avec PHP

Dans les scénarios où vous souhaitez offrir en toute sécurité aux utilisateurs le téléchargement unique d'un fichier volumineux sans consommer trop mémoire, la question se pose : comment diffuser le fichier efficacement ?

L'approche conventionnelle consistant à utiliser file_get_contents() pour récupérer l'intégralité du fichier le contenu s'avère simultanément peu pratique en raison de limitations potentielles de la mémoire. Pour résoudre ce problème, envisagez d'utiliser une méthode de streaming qui fournit les données en morceaux gérables.

Une solution, suggérée dans une source en ligne, consiste à utiliser la fonction readfile_chunked(). Cette fonction vous permet de spécifier une taille de morceau et de lire et d'afficher de manière itérative le contenu du fichier, évitant ainsi la surcharge de mémoire.

L'exemple de code fourni démontre la mise en œuvre de cette approche :

// Define the chunk size in bytes
define('CHUNK_SIZE', 1024*1024);

// Function to read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt = 0;
    $handle = fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();

        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }

    $status = fclose($handle);

    if ($retbytes & $status) {
        return $cnt; // Return the number of bytes delivered.
    }

    return $status;
}

// Restrict access to logged-in users
if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: '.$mimetype );
    readfile_chunked($filename);
} else {
    echo 'Access denied.';
}

Cette approche diffuse le fichier en morceaux gérables, évitant les contraintes de mémoire et fournissant le fichier aux utilisateurs de manière efficace.

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