Avatar billede walden Nybegynder
24. oktober 2009 - 12:44 Der er 20 kommentarer og
1 løsning

login-script søger i stor txt-fil - kan det gøres hurtigere

Hvis man gemmer brugernavne og passwords i en txt-fil, så kan denne txt-fil jo gå hen og blive meget stor.

Er det muligt fx at dele txt-filen op i to dele, så brugere, der logger på, kan nøjes med kun af søge halvdelen af filen igennem?
Avatar billede ebusiness Nybegynder
24. oktober 2009 - 12:51 #1
Enten kan du bruge en database til at opbevare brugernavne osv. det er den mest almindelige metode.

Hvis du hellere vil bruge filer, så prøv med en fil per bruger, hvor brugernavnet bruges som en del af filnavnet. Vær dog opmærksom på at sådan en fremgang kan give alvorlige sikkerhedsfejl hvis ikke det bliver gjort rigtigt.
Avatar billede walden Nybegynder
24. oktober 2009 - 13:22 #2
Det skal gerne være en txt-fil (eller 2).

Er det muligt at have to filer fx med brugere der starter med a-h i den ene og resten (h-z) i den anden - og er der nogen der kort kan forklare hvordan?
Avatar billede leif Seniormester
24. oktober 2009 - 13:32 #3
Bare nysgerrig, hvorfor skal det gerne være en TXT fil ? Hvis den så i det mindste ligger så den ikke kan tilgåes via en adresselinie i browseren men kan den det er det et kæmpe sikkerhedshul.

Du kan jo trække første bogstav ud af brugernavnet og ud fra den værdi du får så have i dit script at hvis det er K så skal den kigge i filen yyy.txt og er det D så er det xxx.txt
Avatar billede walden Nybegynder
24. oktober 2009 - 13:46 #4
Ja - det må være noget i den stil, der skal til. Tak for det. Txt-filen skal i øvrigt ikke kunne tilgåes fra adresselinien.

Gider du oprette et svar, så jeg kan give points?

Er det for meget at bede om et kodeeksempel på, hvordan jeg trækker begyndelses-bogstavet ud af brugernavnet?
Avatar billede ebusiness Nybegynder
24. oktober 2009 - 13:59 #5
"Er det for meget at bede om et kodeeksempel på, hvordan jeg trækker begyndelses-bogstavet ud af brugernavnet?"

Ikke så meget fordi at det er svært at svare, mere fordi spørgsmålet får mig til at overveje om du burde rode med login og kodeord.

Her:
substr($str,0,1)
Avatar billede walden Nybegynder
24. oktober 2009 - 14:10 #6
Der er tale om et testsite ... og et sted skal man jo starte ...
Avatar billede ebusiness Nybegynder
24. oktober 2009 - 14:40 #7
Godt nok. Men altså, du ender stadigvæk med et ydelsesproblem selvom du deler login information op i to filer.
Avatar billede walden Nybegynder
24. oktober 2009 - 14:52 #8
Okay ... og så er vi jo tilbage ved det, der fik mig til at spørge i første omgang :-)

Altså: findes der en metode, der kan eliminere det ydelsesproblem - ved brug af tekstfiler?
Avatar billede ebusiness Nybegynder
24. oktober 2009 - 15:21 #9
Som sagt i #1, en fil per bruger. Det kræver selvfølgelig et filsystem som kan håndtere store directories ordentligt.
Avatar billede showsource Seniormester
24. oktober 2009 - 16:14 #10
Du skal godt nok ha' mange brugere i din txt-fil, hvis det skal ha' noget at sige hastighedsmæssigt.

Og første tegn i en var kan iøvrigt fås med:

echo $var[0];
eller
echo $var{0};
Avatar billede walden Nybegynder
24. oktober 2009 - 16:38 #11
Tusind tak for svarene.

Jeg synes det er værd at spekulere lidt over hvordan et login-script, der er baseret på en txt-fil, afvikles under ekstreme vilkår, fx mange brugere - derfor spørgsmålet

Når du taler om at en txt-fil kan håndtere mange brugere, Showsource, hvilken størrelseorden taler vi så om? Hundrede, tusinde?
Avatar billede walden Nybegynder
24. oktober 2009 - 16:51 #12
Giver denne fremgangsmåde mening:

Når brugere registrerer sig, tjekker jeg på det første bogstav i deres navn og skriver så til fire forskellige txt-filer som forholder sig til fire grupperinger af alfabetet.

Når brugerne så logger på tjekker jeg igen på det første bogstav og læser så fra den txt-fil, hvor deres navn hører hjemme.

Vil det ikke resultere i en bedre ydelse, end hvis alle brugere var samlet i een stor txt-fil med, lad os sige, 4000 linier?

Så skal login-scriptet jo kun søge i en txt-fil med 1000 linier hver gang en bruger logger på, og det må alt andet lige være at foretrække - eller hvad?
Avatar billede walden Nybegynder
24. oktober 2009 - 16:53 #13
For forståelsens skyld:

Ved brugerregistrering vil jeg naturligvis kun skrive til "een af fire forskellige txt-filer som forholder sig til fire grupperinger af alfabetet."
Avatar billede ebusiness Nybegynder
24. oktober 2009 - 17:21 #14
@ Giver denne fremgangsmåde mening:

Ja, det giver mening, og jo flere filer, jo hurtigere kan det gå.
Avatar billede walden Nybegynder
24. oktober 2009 - 17:40 #15
Men du skrev tidligere: "du ender stadigvæk med et ydelsesproblem selvom du deler login information op i to filer."

Du ser altså helst flere filer end 2, når vi taler om mange brugere ... eller er der noget jeg misforstår?

Ok ... under alle omstændigheder vil jeg prøve at følge dit råd, og se om jeg kan finde ud af at dele txt-filen op i flere mindre filer ... dog ikke en txt-fil pr bruger ... det er lidt overkill, synes jeg :-)
Avatar billede showsource Seniormester
24. oktober 2009 - 17:55 #16
Hvis du på noget tidspunkt ender op med 4000 brugere, er du garanteret gået over til at bruge en DB !

Og et tjek i en 4000 liniers fil, hvor hver linie indeholder brugernavn/password, vil nok ikke tag specielt lang tid.
Selvf. afhængig af hardware m.m.
Avatar billede walden Nybegynder
24. oktober 2009 - 18:06 #17
Det er sikkert rigtigt :-)

Jeg betragter det også mere som en akademisk diskussion - og en fin mulighed for at prøve at strikke noget kode sammen - så tak for hjælpen.
Avatar billede showsource Seniormester
24. oktober 2009 - 18:23 #18
Nu ville jeg så lige prøve lokalt på min comp, 2.4 P4 2Gb ram og raid 0 med to diske. max læse 150mbit ( eller så'n), og den popper op med det samme.

Måske et kvart sek. senere på en 133 Mhz maskine med 64 ram ? ( ved det ikke )

Kode som læser fil: ( 4000 linier )

if($_SERVER["REQUEST_METHOD"] == "POST") {

    if(isset($_POST["user"], $_POST["md5_pass"])) {

    $fil = file("users.txt");
    $lines = count($fil);
        for($i = 0; $i < $lines; $i++) {
        $fil[$i] = trim($fil[$i]);
        $bruger = explode("|", $fil[$i]);
            if($_POST["user"] == $bruger[0] && $_POST["md5_pass"] == $bruger[1]) {
            echo"OK user og pass";
            exit;
            }
        }

echo"OK efter forløkke";
exit;

    }
}

Og nej, jeg har ikke prøvet med "tidtagning" da det lige nu og her er ligegyldigt.
Avatar billede walden Nybegynder
24. oktober 2009 - 18:41 #19
Tak igen ... for virkelig seriøse svar på spørgsmålet ... det er jo en fornøjelse ... og måske tager jeg, med min hypotese om de 4000 linier, højde for en helt urealistisk situation ... og Showsources eksempel tyder på, at grænsen for hvornår der opstår ydelsesproblemer i denne sammenhæng, under alle omstændigheder er meget langt væk.
Avatar billede walden Nybegynder
24. oktober 2009 - 20:01 #20
Hvis det i øvrigt er muligt, giver jeg også gerne points til Showsource.
Avatar billede showsource Seniormester
25. oktober 2009 - 05:50 #21
Point betyder ikke noget, men ellers tak ! :O)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester