Comparez la taille de la sortie dynamique d'une fonction à un fichier de destination et effectuez une réécriture

J'ai une fonction pour écrire un fichier texte basé sur les paramètres du formulaire, une forme plutôt grande.

Peu de temps, je veux comparer la sortie d'une fonction à un seul fichier, et ne faire que l'exécution (réécrire le fichier) si le fichier de destination est différent de la sortie. Comme vous le devinez, c'est un problème de performance.

Est-ce faisable, BTW?

Le processus est, je remplis des formulaires:

  1. Un seul fichier est écrit pour contenir certaines options "spécifiques" sélectionnées

  2. Certaines options "non spécifiques" n'écrivent pas nécessairement dans le fichier.

Le formulaire est modifiable à tout moment, de sorte que le contenu du fichier peut augmenter ou diminuer en fonction des différentes options.

Il suffit de réécrire le fichier si je suis au point n ° 1. Quand au point # 2, rien ne devrait être écrit.

C'est ce que j'ai essayé:

if ($output != file_get_contents($filepath)) {
 //save the data
}

Mais je me suis senti tellement retardé d'exécution en cela.

J'ai trouvé un problème presque similaire ici: Puis-je utiliser file_get_contents() pour comparer deux fichiers? , mais mon problème est différent. Le mien consiste à comparer le résultat du processus à un fichier déjà existant qui est simplement le résultat du processus précédent. Et seulement réécrire le fichier s'ils sont différents.

Aucune donnée sensible sur le formulaire, btw. Tout indice est très apprécié.

Merci

0

3 Réponses

Plutôt que de charger le fichier entier en mémoire, il peut être plus rapide de le lire ligne par ligne ( fgets ) et de le comparer ligne par ligne. Vous pouvez même aller aussi petit que caractère par caractère, mais je pense que c'est exagéré.

0
ajouté
Ils le sont, mais si filepath est énorme, cela prendra du temps.
ajouté l'auteur Explosion Pills, source
Merci, les deux sons sont incomparables, non?
ajouté l'auteur swan, source
Oui, vous vouliez dire le contenu de filepath. Cela peut être énorme, car il contient l'agrégation de fichiers écrits dedans. Les options de formulaire se déclenchent principalement pour copier du contenu de fichiers texte et y mettre.
ajouté l'auteur swan, source

Pour comparer un fichier entier avec une chaîne (je suppose que c'est une chaîne, n'est-ce pas?), Le seul moyen est de lire le fichier entier et de faire une comparaison. Pour améliorer les performances, vous pouvez lire le fichier ligne par ligne et arrêter à la première ligne différente, comme dit Explosion Pills avant moi.

Si votre fichier est vraiment volumineux et que vous voulez encore améliorer les performances, vous pouvez effectuer des opérations de hachage:

  • Generate the output, let's say $output.
  • Calculate md5($output) and store in $output_md5.
  • Compare $output_md5 with a stored one, let's say in file output.md5.
  • Are they equal?
    • If yes, do nothing.
    • If not, save $output into output.txt and $output_md5 in output.md5.
0
ajouté
Merci, cela semble raisonnable, comme le sha1_file suggéré() sur le lien.
ajouté l'auteur swan, source
Merci pour les étapes détaillées.
ajouté l'auteur swan, source
L'utilisation de sha1_file() oblige PHP à lire le fichier entier chaque fois que vous voulez le vérifier. Calculez SHA1 ou MD5 (comme vous le souhaitez) et stockez , vous n'avez donc pas besoin de le recalculer à chaque fois.
ajouté l'auteur lorenzo-s, source

Vous pouvez toujours essayer une combinaison de ce qui était dans l'autre publication, la fonction sha1_file ($ file) , avec la fonction sha1 ($ string) , et vérifier l'égalité des cette.

0
ajouté
Merci d'avoir clarifié la boue.
ajouté l'auteur swan, source
Utiliser sha1_file() oblige PHP à lire le fichier entier chaque fois que vous voulez le vérifier, car le hachage doit être calculé. Ce n'est pas mieux que de vérifier le contenu du fichier. Si vous stockez un hachage dans un fichier, puis utilisez un hachage stocké pour faire une comparaison (comme je l'ai dit dans ma réponse), alors, d'accord, vous êtes sur la bonne voie.
ajouté l'auteur lorenzo-s, source