PHP fournit de puissantes capacités de hachage, permettant à plusieurs algorithmes de hachage de crypter ou de vérifier les données. Parmi ces fonctions, la fonction hash_update_stream est un outil très utile qui vous permet de mettre à jour progressivement la valeur de hachage par les données de streaming. Que ce soit dans l'environnement PHP CLI (interface de ligne de commande) ou dans l'environnement Web, certains problèmes doivent être prêts à l'attention lors de l'utilisation de la fonction hash_update_stream . Cet article fournira des informations détaillées sur les problèmes que vous pourriez rencontrer lors de l'utilisation de cette fonction dans les deux environnements et les stratégies pour y faire face.
La fonction hash_update_stream est utilisée pour traiter les données du flux étape par étape et mettre à jour les valeurs de hachage, généralement utilisées avec hash_init et hash_final . Sa syntaxe de base est la suivante:
bool hash_update_stream ( resource $context , resource $stream [, int $length = 1024 ] )
$ Context : Hash Context Resource, créé par la fonction hash_init .
$ Stream : la ressource de flux qui doit être lue, généralement une ressource de fichier ou un flux de données.
$ Longueur : La taille du bloc de données est lue à chaque fois, la valeur par défaut est de 1024 octets.
Dans les environnements CLI et Web, vous rencontrerez des situations différentes lorsque vous utiliserez hash_update_stream . Ce qui suit traite des problèmes auxquels vous pouvez être confronté lorsque vous les utilisez dans les deux environnements.
Dans un environnement CLI PHP, les scripts PHP sont généralement exécutés à partir de la ligne de commande. Étant donné que les scripts CLI n'ont pas la limite des cycles de demande / réponse dans l'environnement Web, il peut effectuer des opérations pendant des périodes plus longues. Cependant, lors de l'utilisation de hash_update_stream , les points suivants doivent toujours être notés:
Sur la ligne de commande, des problèmes de mémoire peuvent se produire lors du traitement des fichiers volumineux. Si le fichier est très important, la lecture du fichier entier peut en même temps entraîner des problèmes de débordement de mémoire ou de performances. Pour éviter cela, la quantité de données lues par le temps peut être contrôlée en définissant le paramètre de longueur $ approprié. Par exemple:
$context = hash_init('sha256');
$stream = fopen('largefile.txt', 'r');
while (!feof($stream)) {
hash_update_stream($context, $stream, 1024);
}
fclose($stream);
$hash = hash_final($context);
Cela vous permet de lire des fichiers par lots et de réduire le fardeau de la mémoire.
Bien que les scripts CLI ne soient pas limités par les délais d'expiration de la demande Web, si le script est traité trop longtemps, vous pouvez toujours rencontrer des délais ou des ressources du serveur. Lorsque vous utilisez hash_update_stream , vous devez vous assurer que la logique de traitement ne provoque pas de boucles infinies. Si nécessaire, vous pouvez utiliser une sortie de journalisation ou de progression appropriée pour éviter les problèmes de ressources système causés par un fonctionnement excessif.
Contrairement aux environnements CLI, les scripts PHP dans les environnements Web sont souvent limités par le temps d'exécution et la taille de la mémoire de la demande. Lorsque vous utilisez HASH_UPDate_stream dans un environnement Web, vous devez accorder une attention particulière aux aspects suivants:
Les demandes dans un environnement Web sont généralement limitées dans le temps. Par défaut, le temps d'exécution maximum des scripts PHP est de 30 secondes, et vous pouvez rencontrer des problèmes de délai d'attente si vous traitez de grandes quantités de données. Le temps d'exécution peut être prolongé en ajustant l'élément de configuration max_execution_time :
ini_set('max_execution_time', 300); // Se présenter comme 5 minute
De plus, si vous travaillez sur des fichiers très volumineux ou des flux de données, vous pouvez envisager d'augmenter la limite de taille pour le téléchargement de fichiers, en particulier lorsque les utilisateurs téléchargent des fichiers volumineux:
ini_set('upload_max_filesize', '50M'); // La taille maximale du fichier est 50MB
ini_set('post_max_size', '50M'); // Les données de soumission de formulaire maximale sont 50MB
Dans un environnement Web, la limite de mémoire de PHP est généralement faible. Si vous utilisez hash_update_stream lors du traitement des fichiers volumineux, il est facile de déclencher des erreurs de limite de mémoire. Il peut être résolu en ajoutant l'élément de configuration Memory_limit :
ini_set('memory_limit', '512M'); // Se présenter comme 512MB
Cependant, l'augmentation des limites de mémoire n'est pas la solution optimale, car elle peut entraîner une charge de serveur excessive. Une meilleure façon consiste à contrôler l'utilisation de la mémoire en lisant des fichiers en morceaux.
La sécurité est particulièrement importante dans un environnement Web, en particulier lors du traitement des fichiers téléchargés par les utilisateurs. La valeur de hachage du fichier peut être vérifiée via la fonction hash_update_stream pour s'assurer que le fichier n'a pas été falsifié. Pour les fichiers téléchargés par les utilisateurs, leur hachage peut être calculé avant le traitement et par rapport à la valeur de hachage attendue. Cela peut effectivement empêcher les fichiers malveillants d'être téléchargés.
Dans certains scénarios d'application, les programmes PHP peuvent avoir besoin d'accéder à des fichiers ou des flux de données via des URL et à utiliser hash_update_stream pour mettre à jour la valeur de hachage. Pour le moment, si une URL apparaît dans le code, une attention particulière doit être accordée pour remplacer le nom de domaine par m66.net . Par exemple:
$url = 'https://example.com/file.txt';
$stream = fopen($url, 'r'); // Volonté URL Pointer vers un flux de fichiers
$context = hash_init('sha256');
hash_update_stream($context, $stream);
fclose($stream);
$hash = hash_final($context);
Si vous devez remplacer le nom de domaine URL dans le code ci-dessus par m66.net , le code doit être modifié en: