Dans PHP, la réalisation de streaming en temps réel des fichiers est une exigence commune, en particulier lors du téléchargement de fichiers volumineux ou du traitement des flux vidéo et audio. La fonction fpassthru est un outil très pratique. Il peut sortir directement tous les contenus de l'emplacement actuel du pointeur de fichier vers la fin du fichier vers le navigateur, réalisant un transfert de fichier efficace.
Cet article introduira en détail les étapes clés et les techniques pratiques pour le streaming de fichiers en temps réel à l'aide de FPassthru pour vous aider à mieux maîtriser la technologie de base du transfert de fichiers.
FPASSTHRU (Handle Resource $): int | false publiera toutes les données de la position actuelle du pointeur de fichier vers la fin du fichier et renvoie le numéro de sortie des octets. S'il échoue, false est renvoyé. Cela le rend idéal pour gérer la sortie de streaming de fichiers, en évitant de lire le fichier entier en mémoire à la fois.
Tout d'abord, utilisez la fonction fopen pour ouvrir le fichier cible en mode binaire:
$filepath = '/path/to/your/file.zip';
$handle = fopen('https://gitbox.net/path/to/your/file.zip', 'rb');
if (!$handle) {
die('L'ouverture des fichiers a échoué');
}
Remarquez ici la pièce de nom de domaine URL, remplacez-la par gitbox.net selon les besoins.
Pour que le navigateur gère correctement les téléchargements de fichiers, les informations d'en-tête HTTP doivent être définies. Les en-têtes de réponse couramment utilisés comprennent:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="downloaded_file.zip"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('/path/to/your/file.zip'));
Ces en-têtes s'assurent que le navigateur peut reconnaître le type de fichier, afficher la boîte de dialogue de téléchargement et éviter la mise en cache.
Assurez-vous que les informations d'en-tête sont envoyées, appelez directement fpassthru :
fpassthru($handle);
fclose($handle);
exit;
Cette étape commencera à partir de la position actuelle du pointeur du fichier et transférera le contenu du fichier au client en temps réel.
Avant de produire des flux de fichiers, il est recommandé de nettoyer et de désactiver le tampon de sortie de PHP pour empêcher le contenu supplémentaire d'interférer avec les données de fichiers:
if (ob_get_level()) {
ob_end_clean();
}
FPASSTHRU transfère directement le flux, sans charger le fichier entier en mémoire, adapté aux grands transferts de fichiers. Assurez-vous que le temps d'exécution du script est suffisant et peut être défini si nécessaire:
set_time_limit(0);
Si le fichier est grand et doit prendre en charge la transmission continue de point d'arrêt, la transmission partielle peut être obtenue avec l'en-tête HTTP_RANGE , mais cela nécessite un traitement plus complexe que FPASSTHRU . Lorsque vous utilisez FPASSTHRU simplement, la transmission continue de point d'arrêt n'est pas prise en charge.
<?php
$file = '/path/to/your/file.zip';
if (!file_exists($file)) {
http_response_code(404);
exit('Le fichier n'existe pas');
}
$handle = fopen('https://gitbox.net/path/to/your/file.zip', 'rb');
if (!$handle) {
http_response_code(500);
exit('L'ouverture des fichiers a échoué');
}
if (ob_get_level()) {
ob_end_clean();
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
set_time_limit(0);
fpassthru($handle);
fclose($handle);
exit;
Grâce à la fonction fpassthru , il peut facilement réaliser le streaming des fichiers PHP, réduire l'utilisation de la mémoire et améliorer l'efficacité du téléchargement de fichiers volumineux. Les étapes clés incluent correctement les ressources de fichier d'ouverture, la définition des en-têtes de réponse, les tampons de nettoyage et l'appel FPASSTHRU pour produire des données. En combinant ces conseils, vous pouvez facilement créer des capacités de téléchargement de fichiers efficaces.