Dans PHP, la continuation de point d'arrêt est une exigence commune lors du traitement des téléchargements de fichiers. Il permet à l'utilisateur de continuer à télécharger à partir de l'emplacement interrompu une fois le processus de téléchargement déconnecté, en évitant de refaire le téléchargement de l'ensemble du fichier. Habituellement, la clé de la mise en œuvre de la transmission continue de point d'arrêt réside dans le traitement des en-têtes HTTP et la prise en charge du serveur pour les demandes de plage.
Ainsi, Stream_Context_Set_Params peut-il être utilisé pour implémenter la transmission continue de point d'arrêt du fichier? Comment le configurer?
Stream_Context_Set_Params est une fonction utilisée dans PHP pour définir des paramètres pour les contextes de flux existants. Il est souvent utilisé pour ajuster le comportement des flux, tels que les délais d'attente, les rappels de notification, etc. Son formulaire d'utilisation est:
stream_context_set_params(resource $stream_context, array $params): bool
Les paramètres peuvent inclure:
Notification : définissez la fonction de rappel
Timeout : définissez l'heure du délai (secondes)
Blocage : s'il faut bloquer le flux
L'implémentation de la transmission continue de point d'arrêt repose principalement sur l'en-tête de plage dans le protocole HTTP, et le serveur renvoie les données dans la plage d'octets correspondante en fonction de l'en-tête de demande. Par exemple:
Range: bytes=1000-
Indique que le client veut commencer à télécharger à partir de l'octet 1000.
Après avoir reçu une telle demande, le serveur renvoie le contenu partiel du code d'état 206 et apportera une chaîne de contenu dans l'en-tête de réponse pour dire au client quelle partie du fichier qu'il a renvoyé.
À strictement parler, Stream_Context_Set_Params lui-même n'est pas conçu pour gérer les en-têtes HTTP. Il est utilisé pour définir des paramètres de flux. Il ne peut pas être utilisé directement pour configurer la plage de l'en-tête de demande HTTP, et il ne peut pas gérer le code d'état de réponse côté serveur et la transmission segmentée.
Si vous souhaitez lancer une demande HTTP dans PHP qui prend en charge la transmission continue de point d'arrêt, vous devez utiliser Stream_Context_Create avec l'option HTTP pour définir l'en-tête de demande, telles que:
$options = [
'http' => [
'method' => 'GET',
'header' => "Range: bytes=1000-\r\n",
]
];
$context = stream_context_create($options);
$file = file_get_contents('http://m66.net/path/to/file', false, $context);
De cette façon, le client peut demander que le fichier soit téléchargé à partir des octets spécifiés.
<?php
$start = 1000; // Depuis1000Octets commencent à télécharger
$options = [
'http' => [
'method' => 'GET',
'header' => "Range: bytes=$start-\r\n",
'ignore_errors' => true, // Autoriser la réception 206 réponse
]
];
$context = stream_context_create($options);
$url = 'http://m66.net/path/to/largefile.zip';
$fileContent = file_get_contents($url, false, $context);
// Peut $fileContent Ajouter aux fichiers existants,Mettre en œuvre une transmission continue et une fusion
file_put_contents('localfile.zip', $fileContent, FILE_APPEND);
?>
Dans l'exemple ci-dessus, l'objectif est d'ajouter une plage via l'en-tête de l'option HTTP pour permettre au serveur de retourner la partie du contenu. Stream_Context_Set_Params n'est pas utilisé car il n'est pas responsable de la définition de l'en-tête de demande.
Le client initie une demande avec un en-tête de plage uniquement la première étape pour la poursuite du point d'arrêt, et le serveur doit prendre correctement et répondre aux demandes avec une plage.
Le serveur doit renvoyer le code d'état 206 Contenu partiel
Le serveur doit régler correctement l'en-tête de la rangement de contenu
Le serveur prend en charge la lecture des points d'arrêt des fichiers
Si le serveur ne le prend pas en charge, le client demande l'en-tête de plage et renvoie toujours l'intégralité du fichier.
Stream_Context_Set_Params est principalement utilisé pour définir des paramètres de flux, pas pour définir les en-têtes de demande HTTP, et ne peut pas implémenter directement la transmission continue de point d'arrêt.
Pour implémenter la transmission continue du point d'arrêt, vous devez utiliser Stream_Context_Create et définir l'en-tête de demande de plage dans l'option HTTP .
Le serveur doit également prendre en charge correctement les demandes de plage de points d'arrêt.
Combiné avec la fonction de fonctionnement du fichier PHP, la fonction de téléchargement de fichiers continu du client peut être réalisée.