Maison >développement back-end >tutoriel php >Comment puis-je diffuser des fichiers volumineux en PHP sans les charger entièrement en mémoire ?

Comment puis-je diffuser des fichiers volumineux en PHP sans les charger entièrement en mémoire ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-19 22:38:15484parcourir

How Can I Stream Large Files in PHP Without Loading Them Entirely into Memory?

Streaming de gros fichiers en PHP

La fonction file_get_contents intégrée de PHP est un moyen pratique de lire un fichier dans une chaîne, mais elle a une limitation importante : il charge l'intégralité du fichier en mémoire en une seule fois. Cela peut être problématique pour les fichiers volumineux, car cela peut épuiser votre limite de mémoire PHP et provoquer l'échec de votre script.

Heureusement, il existe des moyens de diffuser un fichier volumineux à un utilisateur sans tout charger en mémoire. Une technique consiste à utiliser la fonction readfile_chunked. Cette fonction prend un nom de fichier comme argument et envoie le contenu du fichier au tampon de sortie en morceaux d'une taille spécifiée.

Voici un exemple d'utilisation de la fonction readfile_chunked :

define('CHUNK_SIZE', 1024 * 1024); // Size (in bytes) of tiles chunk

// 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 num. bytes delivered like readfile() does.
    }

    return $status;
}

// Check if the user is logged in
// ...

if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: ' . $mimetype);
    readfile_chunked($filename);

} else {
    echo 'Tabatha says you haven\'t paid.';
}

Dans cet exemple, nous définissons une constante CHUNK_SIZE pour spécifier la taille de chaque morceau (en octets). La fonction readfile_chunked lit ensuite le fichier en morceaux et les envoie au tampon de sortie. Les fonctions ob_flush et flush sont appelées pour garantir que les morceaux sont envoyés au client au fur et à mesure de leur génération.

Cette technique vous permet de diffuser des fichiers volumineux vers un utilisateur sans avoir à charger l'intégralité du fichier en mémoire. C'est un moyen efficace de transmettre des fichiers volumineux via des connexions HTTP.

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