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!