Maison >développement back-end >tutoriel php >Comment puis-je diffuser des fichiers volumineux en PHP sans dépasser les limites de mémoire ?

Comment puis-je diffuser des fichiers volumineux en PHP sans dépasser les limites de mémoire ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 03:21:11603parcourir

How Can I Stream Large Files in PHP Without Exceeding Memory Limits?

Streaming de gros fichiers avec PHP

Lorsque vous traitez des fichiers volumineux qui dépassent la limite de mémoire de PHP, il devient nécessaire de diffuser le fichier directement vers le le navigateur de l'utilisateur sans le charger entièrement en mémoire. Cette technique permet une gestion efficace de données volumineuses sans provoquer de problèmes d'épuisement de la mémoire.

Une approche du streaming de fichiers consiste à utiliser la fonction file_get_contents(). Cependant, cette méthode nécessite que l'intégralité du fichier soit chargée en mémoire, ce qui n'est pas réalisable pour les fichiers volumineux.

Pour surmonter cette limitation, nous pouvons mettre en œuvre une approche de segmentation, dans laquelle le fichier est divisé en morceaux plus petits et diffusé en continu. séquentiellement. Voici une approche recommandée :

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

// 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;
}

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

Dans ce code, la fonction readfile_chunked() divise le fichier en morceaux de 1 Mo et diffuse chaque morceau vers le navigateur de l'utilisateur. Le vidage des tampons de sortie garantit que les morceaux sont envoyés immédiatement sans attendre la lecture de l'intégralité du fichier.

En mettant en œuvre cette approche, vous pouvez diffuser efficacement des fichiers volumineux aux utilisateurs sans rencontrer de problèmes de mémoire.

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