Comparați dimensiunea ieșirii dinamice a unei funcții cu un fișier de destinație și efectuați o rescriere

Am o funcție de a scrie un fișier text bazat pe setările formularului, o formă destul de mare.

În curând, vreau să comparăm ieșirea unei funcții cu un singur fișier și să execut numai (rescrierea fișierului) dacă fișierul de destinație este diferit de ieșire. După cum credeți, este o preocupare pentru performanță.

Este posibil, BTW?

Procesul este că, umplem câteva forme:

  1. Un singur fișier este scris pentru a conține anumite opțiuni selectate "specifice"

  2. Unele opțiuni "non-specifice" nu scriu neapărat nimic în fișier.

Formularul poate fi actualizat oricând, astfel încât conținutul fișierului să crească sau să se micsoreze în funcție de opțiuni diferite.

Are nevoie doar de o rescriere la fișier dacă sunt la punctul # 1. Când la punctul # 2, nu trebuie scris nimic.

Asta am încercat:

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

Dar am simțit atât de multă întârziere a execuției în asta.

Am găsit o problemă aproape similară aici: Pot folosi file_get_contents() pentru a compara două fișiere? , dar problema mea este diferită. Mina compară rezultatul procesului cu un fișier deja existent, care pur și simplu a fost rezultatul procesului anterior. Și rescrieți numai fișierul dacă acestea sunt diferite.

Nu există date sensibile privind formularul, btw. Orice indiciu este foarte apreciat.

Mulțumiri

0

3 răspunsuri

În loc să încărcați întregul fișier în memorie, poate fi mai rapid să îl citiți line-by-line ( fgets ) și să îl comparați cu șirul de intrare, de asemenea, line-by-line. Ați putea chiar să mergeți la fel de mic ca caracterul după personaj, dar cred că este prea mult.

0
adăugat
Ele sunt, dar dacă filepath este mare, va dura mult timp.
adăugat autor Explosion Pills, sursa
Mulțumesc, sună că cele două sunt incomparabile, nu?
adăugat autor swan, sursa
Da, ai vrut să spui conținutul filepath. Acesta poate fi uriaș, deoarece conține agregarea fișierelor scrise acolo. Opțiunile de formular declanșează cea mai mare parte a copierii unui anumit conținut din fișierele text și plasate acolo.
adăugat autor swan, sursa

Pentru a compara un fișier întreg cu un șir (presupun că este un șir, nu-i așa?), Singura modalitate este de a citi întregul fișier și de a compara. Pentru a îmbunătăți performanța, puteți citi linia fișierului după linie și opriți mai întâi o linie diferită, după cum spune Pilulele de explozie în fața mea.

Dacă fișierul dvs. este foarte mare și doriți să îmbunătățiți performanța în continuare, puteți face anumite lucruri de tip hashing:

  • 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
adăugat
Multumesc, acest lucru pare rezonabil, cum ar fi sugerat sha1_file() pe link.
adăugat autor swan, sursa
Vă mulțumim pentru pași detaliați.
adăugat autor swan, sursa
Folosind sha1_file() cauza PHP să citească întregul fișier oricând doriți să îl verificați. Calculați SHA1 sau MD5 (după cum doriți) și stocați , astfel încât să nu aveți nevoie să îl calculați de fiecare dată.
adăugat autor lorenzo-s, sursa

Puteți încerca întotdeauna o combinație a celor din cealaltă post, funcția sha1_file ($ file) , cu funcția sha1 (string) și verificați egalitatea acea.

0
adăugat
Vă mulțumim pentru clarificarea noroiului.
adăugat autor swan, sursa
Folosind sha1_file() cauza PHP să citească întregul fișier oricând doriți să îl verificați, deoarece hash trebuie calculat. Nu este mai bine decât să verificați conținutul fișierelor. Dacă stocați hash în timpul fișierului și apoi utilizați hash-ul stocat pentru a face comparația (așa cum am spus în răspunsul meu), atunci, ok, ești pe drumul cel bun.
adăugat autor lorenzo-s, sursa
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT