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
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 :)
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|
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.
Jos haluaa päästä helpolla, niin käytä näitä:
https://www.php.net/manual/en/function.
https://www.php.net/manual/en/function.
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
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.
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.
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.
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... :)
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
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?
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ä)
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ää?
Safemode :(
Ellei sitä ole otettu pois...?
Safemode estää kansioiden luonnin?
Estää kansioiden CHMOD oikeuksien antamisen PHP:llä. Valittaa jostain UID:stä...
Ei MBnetissä minun mielestäni ole safemode päällä... vai onko?
Onhan siellä.
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.
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.
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.
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.
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
- Appendilla ei voi estää tiedoston hajoamista.
- Flock ei auta!!
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. 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
Kiitoksia avusta T.M.
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>
Nyt vielä viestin lisäys txt-fileihin ja asennus, niin kaikki taitaapi olla valmiina.
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.