Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Foorumin tietojen tallennus

Sivun loppuun

Bagard [05.04.2004 16:36:24]

#

Ajattelin tässä väsätä oman foorumin PHP:llä ja tuli mieleen, että miten foorumin tiedot (kategoriat, foorumit, threadit ja viestit) kannattaisi tallentaa? Käytössä EI ole MySQL, vaan tiedot pitäisi tallentaa txt-fileihin.

Eli foorumin päävalikossa on ensin kategorioita joihin erilaiset foorumit kuuluvat. Foorumia klikkaamalla avautuu lista, jossa on threadit. Threadin nimeä painamalla avautuu threadi, jossa vastaukset on. Jokaisesta threadista ennen klikkausta pitäisi nähdä threadin nimi, aloittaja ja viimeisin vastaus (koska ja kuka kirjoitti).

Itse olin suunnitellut, että jokaiselle alueelle on oma aihetiedosto, jossa sijaitsevat threadien tiedostot (esim. thread_503.txt sisältäisi 503. threadin viestit). Eli threadia klikkaamalla avautuisi sivu index.php?thread=503. Samalla tavalla jaettaisiin myös foorumit eri kategorioihin.

EDIT: tuossa on "kuva" foorumista ja mitä tietoja pitäisi saada esille: http://koti.mbnet.fi/roinaa/roinaa/forumtesti

Olga [05.04.2004 16:52:04]

#

Fiksuinta tapaa en tiedä, mutta kätevää olisi jos yhdessä tiedostossa (aiheet.txt) olisi aiheet niiden id-nrot, tyyliin

aihe1|id
aihe2|id
aihe3|id

jne. Ja sit olis threadit yhdessä tiedostossa (threadit.txt), jossa threadit seuraavasti:

thread1|threadID|aiheID
thread2|threadID|aiheID
thread3|threadID|aiheID

jne. Ja sit yhdessä tiedostossa viestit, tyyliin

viesti1|viestiID|threadID|nimi|aika|jne
viesti2|viestiID|threadID|nimi|aika|jne
viesti3|viestiID|threadID|nimi|aika|plaah

Näin viestit&threadit&aiheet on helppo yhdistää ja muutenkin homma pysyy siististi kuosissa. Ainoa probleema on se, että jos käyttäjiä (-> viestejä) on paljon, noi tiedostot joutuu aika kovaan käyttöön ja jos ei lukitukset ja muut ole kunnossa, voi ilmetä näitä tyypillisiä tekstitiedosto-ongelmia. Mut näinhän se on, oli tyyli sitten mikä tahansa :)

Bagard [05.04.2004 17:05:22]

#

Ajattelin sellaista, että olisi esim. ekalle foorumille tiedosto (1_1_threadit.txt, eli kat.nro._forumnro._threadit.txt), jossa olisi threadit muodossa: threadinnimi|kirjoittaja|kirjoitettu|vastaukset|id|

Ja id olisi threadin ID (monesko threadi, aina uuteen threadiin yhdellä isompi numero kuin edelliseen) Uuden ID:n voisi vaikka tarkastaa esim. tiedot.txt filestä missä jollain rivillä olisi vaikka 5, eli uuden threadin ID. Aina kun uusi threadi kirjoitettaisiin, ID:tä korotettaisi yhdellä.

Threadissa (esim. thread_ID.txt) olisi ensimmäisellä rivillä threadin nimi. Seuraavilla riveillä olisi alkuperäinen viesti ja sitä seuraavilla vastaukset.

T.M. [05.04.2004 17:08:18]

#

Jos haluaa päästä helpolla, niin käytä näitä:
https://www.php.net/manual/en/function.serialize.php
https://www.php.net/manual/en/function.unserialize.php

Sen verran kokemusta on että voin sanoa, että laita jokainen viesti omaan tiedostoonsa.
Täten viestejä ei voi tuhota millään tavalla.

lainaus:

...noi tiedostot joutuu aika kovaan käyttöön ja jos ei lukitukset ja muut ole kunnossa, voi ilmetä näitä tyypillisiä tekstitiedosto-ongelmia. Mut näinhän se on, oli tyyli sitten mikä tahansa :)

Kyllä sen saa hajoamattomaksikin, esimerkiksi tällä tyylillä:
- Eri alueille omat kansionsa
- Jokaiselle aiheelle oma kansionsa
- Jokainen viesti(ja kaikki muut tiedot..) omaan tiedostoonsa

Tosin tota en pysty tehdä mbnetissä... joten tyydyn nykyisellään käyttämään korkeinaan jokaiselle foorumille tehtyä kansiota :P

Sitten vielä:
- Jokaiseen viestiin tallennetaan käyttäjän ID-numero
- Jokaisesta viestistä haetaan ID-numeron perusteella käyttäjän nimi

Ainiin. Ne viestit saa hakemistosta kätevällä glob() funktiolla:
https://www.php.net/manual/en/function.glob.php

Olga [05.04.2004 17:27:40]

#

Tulee kyl julmettu määrä tiedostoja tuolla tavalla, mut tosiaan säästyy sit noilta probleemilta. Ja joo, jos meinaat tehdä rekisteröitymissysteemin foorumiin, niin luonnollisesti noi käyttäjäID:t kans käyttöön.

Bagard [05.04.2004 17:44:55]

#

Kyllä luulisi riittävän, että jokainen threadi menisi omaan tiedostoon ja siihen samaan myös replyt? En usko että tuolla foorumilla tulee olemaan sellaista liikennettä että tiedostot menisi sekaisin.

T.M. [05.04.2004 17:55:14]

#

Irksome kirjoitti:

Tulee kyl julmettu määrä tiedostoja tuolla tavalla, mut tosiaan säästyy sit noilta probleemilta. Ja joo, jos meinaat tehdä rekisteröitymissysteemin foorumiin, niin luonnollisesti noi käyttäjäID:t kans käyttöön.

Tulee kyl julmetun nopee myös ;)
Mitäpä ne tiedostojen määrä vaikuttaa? Ainoo haitta on että niiden kaikkien poistamiseen menee noin 5min, jos viestejä on 10000 :)

Itse päätin käyttää tuota systeemiä, kun meni hermot siihen tiedostojen tyhjentymiseen.

lainaus:

Kyllä luulisi riittävän, että jokainen threadi menisi omaan tiedostoon ja siihen samaan myös replyt? En usko että tuolla foorumilla tulee olemaan sellaista liikennettä että tiedostot menisi sekaisin.

Yksi ainoa ihminen voi sekottaa koko aiheen kaikki viestit jos vain haluaa. Mutta jos... viestit ovat omassa tiedostossaan, ei sinun tarvitse vaivata tuolla päätäsi.

Olga [05.04.2004 18:02:14]

#

T.M. kirjoitti:

Itse päätin käyttää tuota systeemiä, kun meni hermot siihen tiedostojen tyhjentymiseen.

Eikö asianmukainen flock()-funktion käyttö estä tyhjentymistä? Itse kun en ole moista kokenut, kunhan kuullut huhuttavan... :)

T.M. [05.04.2004 18:05:50]

#

Irksome kirjoitti:

T.M. kirjoitti:

Itse päätin käyttää tuota systeemiä, kun meni hermot siihen tiedostojen tyhjentymiseen.

Eikö asianmukainen flock()-funktion käyttö estä tyhjentymistä? Itse kun en ole moista kokenut, kunhan kuullut huhuttavan... :)

Eipä auta. PHP.netissäkin lukee asialla päätä vaivanneiden kommentteja sen huonosta toiminnasta.
Itse ainakin olen onnistunut tuhoamaan tiedostoni tavalla tai toisella, vaikka flockkia olen käyttänyt :P

Bagard [05.04.2004 18:11:38]

#

Olen kanssa huomannut (kävijälaskuri nollaantuu jos rämppää Päivitä-nappia), että flock:n merkitys on sama kuin echo ""; :P

"Yksi ainoa ihminen voi sekottaa koko aiheen kaikki viestit jos vain haluaa."
Onkohan noin, jos käyttää viesteissä kunnollisia replaceja yms?

EDIT: taidan sitten laittaa jokaisen viestin omaan tiedostoon, kun sitä niin suositellaan. Mitenkäs tiedostojen linkitys oikeisiin threadeihin onnistuu?

T.M. [05.04.2004 18:14:07]

#

Bagard kirjoitti:

"Yksi ainoa ihminen voi sekottaa koko aiheen kaikki viestit jos vain haluaa."
Onkohan noin, jos käyttää viesteissä kunnollisia replaceja yms?

Yhtä hyvin mahdollista kuin kävijälaskurisi nollaaminen :P
Ainakin tuo on todennäköisempää kuin että jos ne olisivat yksi viesti yhdessä tiedostossa :)

Itseltäni meni tosiaankin luottamus yhden tiedoston järjestelmään jo aikaa sitten. Kun se prkl hajos vähän välii, ja samassa lähti satojen ihmisten tiedot :D (onneksi keksin varmuuskopioida niitä)

Bagard [05.04.2004 18:21:26]

#

T.M. kirjoitti:

Tosin tota en pysty tehdä mbnetissä... joten tyydyn nykyisellään käyttämään korkeinaan jokaiselle foorumille tehtyä kansiota :P

Mikäs tuon MBnetissä estää?

T.M. [05.04.2004 18:49:24]

#

Safemode :(
Ellei sitä ole otettu pois...?

Bagard [05.04.2004 18:54:48]

#

Safemode estää kansioiden luonnin?

T.M. [05.04.2004 19:02:34]

#

Estää kansioiden CHMOD oikeuksien antamisen PHP:llä. Valittaa jostain UID:stä...

Tempfile [05.04.2004 19:13:06]

#

Ei MBnetissä minun mielestäni ole safemode päällä... vai onko?

Olga [05.04.2004 19:24:36]

#

Onhan siellä.

Antti Laaksonen [05.04.2004 21:20:54]

#

Tietojen tallentamiseen on tosiaan yhtä monta tapaa kuin tekijääkin, mutta ainakin itse tallentaisin pelkästään tiedostojen loppuun ("append"-avaustapa), jolloin tietoa ei pääse katoamaan missään tilanteessa.

Tämäkin keskustelualue oli kerran tekstitiedostoilla toimiva (kaikki viestit olivat yhdessä ja samassa tiedostossa!). Parin kolmen tuhannen viestin jälkeen alkoivat sitten ongelmat.

Bagard [05.04.2004 22:04:44]

#

Ei missään nimessä ole itsellä tullut mieleen tallentaa kaikkia viestejä samaan tiedostoon :). Voisihan olla, että laittaisinkin vain threadille oman tiedoston ja siihen kaikki replyt appendilla. Ainakin helpottaisi paljon viestisysteemin tekoa.

T.M. [05.04.2004 22:12:04]

#

Ja miksei append muka voi aiheuttaa tiedoston tyhjenemistä?
Kyllä minulla vain tyhjenee tiedosto kuin tiedosto, olipa se tallennettu millä tavalla tahansa :P
Yhden kerran olen onnistunut estämään tiedoston tyhjenemisen (mysteeri!), mutta silti siitäkään ei voi olla 100% varma etteikö sekin menisi joskus sekaisin.

Suosittelen edelleen tekemään jokaiselle viestille oman tiedostonsa.

Bagard [06.04.2004 15:41:08]

#

Eli mikäköhän nyt mahtaa olla oikea vastaus? Saako sen tiedoston pilattua appendilla vai ei?

EDIT: olisiko mahdollista tehdä tallennustiedostoon varmistus, missä tiedoston sisältö tallennettaisiin toiseen tiedostoon ja alkuperäisen tiedoston päivityksen jälkeen katsottaisiin onko päivitetty tiedosto pienempi kuin varmuuskopiotiedosto. Jos se olisi niin sitten varmuuskopiotiedosto palautettaisiin ja selain pistettäisiin vaikka takaisin siihen viestinkirjoituskenttään.

Antti Laaksonen [06.04.2004 18:32:27]

#

Bagard kirjoitti:

Saako sen tiedoston pilattua appendilla vai ei?

Ei saa minun kokemukseni mukaan. Nimittäin kun tiedoston avaa appendilla, kirjoituskohta siirretään tiedoston loppuun. Ei ole mitenkään mahdollista, että kirjoitettaisiin vanhan tiedon päälle. Jos skriptin suoritus jostain syystä keskeytyy, niin seuraus on vain se, että tiedosto pysyy ennallaan.

Eräs pieni riski tähän juttuun kuitenkin liittyy. Jos tiedostoon lisätään uutta tietoa useammasta skriptistä tismalleen samaan aikaan, saattaa käydä niin, että tiedot menevät lomittain. Tähän voisi auttaa tuo flock-funktio (jos se siis toimii).

edit: tarkennuksia

T.M. [06.04.2004 20:39:01]

#

- Appendilla ei voi estää tiedoston hajoamista.
- Flock ei auta!!

Bagard [07.04.2004 19:09:34]

#

No täytyy nyt katsoa miten tuo sitten toimii (foorumi toimii nimittäin appendilla) ja systeemin vaihto olisi vaikeampaa kuin uuden tekeminen.
Vielä pitää tehdä viestin kirjoitus niin pääsee testaan.

EDIT: mikäs on muuten helpoin tapa laskea montako thread_[luku].txt tiedostoa kansiossa "include/data" on? Eli tiedostot ovat thread_1.txt, thread_2.txt, thread_3.txt jne...

T.M. [07.04.2004 19:16:35]

#

T.M. kirjoitti:

Kyllä sen saa hajoamattomaksikin, esimerkiksi tällä tyylillä:
- Eri alueille omat kansionsa
- Jokaiselle aiheelle oma kansionsa
- Jokainen viesti(ja kaikki muut tiedot..) omaan tiedostoonsa

Kuten tuossa sanoin, tuolla tyylillä kun tekee, on helpointa tehdä tarvittavat laskelmat, kun käyttää vielä siinä sivussa glob() funktiota (tekee taulukon hakemiston sisällöstä, ja nopeasti!)

eli:

$aiheet = count(glob("aiheet/*.txt"));

Hakee kaikki txt-tiedostot

Bagard [07.04.2004 19:39:11]

#

Kiitoksia avusta T.M.

NiKC [08.04.2004 12:00:10]

#

T.M., miten olet tuota flockia käyttänyt?

Tiedoston tyhjennys on erittäin helppoa mikäli lukon saavuttamiseksi avaa tuon kohdetiedoston suoraan. Johan manuaalissakin suositellaan käyttämään erillistä lukkotiedostoa.

<edit>
Tämä siis jos avaa tiedoston w tai w+ moodissa.
</edit>

Itse tein näin, ja hyvin on toiminut toistaiseksi :)
Vielä kun jaksaisi tehdä apina-skriptin joka spämmaisi forumia urakalla niin kaiketi selviäisi miten homma oikeesti toimii.

<edit>
Taisit T.M. viitata tähän:
On some operating systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you may not be able to rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!

Saatoitpahan olla oikeassa ja minä taas väärässä :\ Tuli vähän hätiköityä. Tuollehan ei sitten tosiaan voi mitään. Mutta ei a-moodilla mielestäni mitenkään pitäisi saada tiedostoa tyhjäksi. Itsellä on käytössä w-moodi joten elän vaarallisesti ;) Kattoos miten äijän käy.
</edit>

Bagard [09.04.2004 00:27:36]

#

Nyt vielä viestin lisäys txt-fileihin ja asennus, niin kaikki taitaapi olla valmiina.

Bagard [11.04.2004 19:41:24]

#

Hmm, mikäs on vikana vaikka include/data kansiolla on 770 oikeudet, niin silti valittaa, että Permission denied. Kun laitan oikeudet tietylle tiedostolle, niin vasta silloin toimii. Foorumi on MBnetissä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta