Miten saadaan määritettyä tekstitiedostolle käyttöoikeudet PHP:ssä? Teen skriptiä jolla käpistellään tekstifilua ja nyt en pysty luomaan fopen()-lauseella tiedostoa jos sitä ei ole jo luotu, nähtävästi riittämättömien oikeuksien vuoksi. Kun se tiedosto on luotu(käsin), niin siihen pystyy kyllä kirjoittamaan. Pitääkö ne oikeudet määrittää siihen hakemistoon, johon tuo tekstifilu on tarkoitus luoda vai sille luotavalle teskstifilulle?
oikeuksien määritys PHP:ssä
PHP-aloittelija
9423
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 9
Vanhimmat
pystyä tiedosto luomaan ihan normaalisti ja skripti pääsee käsittelemään tiedostoa omistajansa oikeuksin.
Veikkaan että et ole tutkinut fopenin mahdollisia parametreja, joissa olemattoman tiedoston luonti voidaan määrätä
Olin määrittänyt fopenin luomaan tiedoston, jos sitä ei ole. Mutta olin tehnyt vähän väärin tuon koko operaation.
Eli ensin määritin polun, jossa filen pitäisi olla. Sitten tutkin, voiko fileen kirjoittaa is_writablella ja jos voi, niin avataan file. No eihän se tietenkään mitään avaa/luo, kun olemattomaan tidostoon ei voi kirjoittaa :D
Tein nyt niin, että mikäli tiedosto ei ole kirjoitettavissa (eli sitä ei ole),niin tällöin luodaan se fopenilla. Muuten se avataan fopenilla.
Ja nuo oikeudet luodulle tiedostolle tulevat omistajalta, eli owner ja group ovat samat, ownerilla luku ja kirjoitus, mulla vain luku.
Ihan pikkuruisena vinkkinä, että kannattaa käyttää PHP:n functioita vain siihen tarkoitukseen mihkä se on tehty. Tuolla is_writable-functiolla selviää pystyykö tiedostoon kirjoittamaan, jos ei niin se voi johtua esim käyttöoikeuksista. Ja muutenkin koodista tulee vaikea selkoista kun functiota käytetään ihan eriasiaan kuin on tarkoitus.
Joten tutustuppas file_exists-functioon http://fi.php.net/manual/fi/function.file-exists.php
Mutta eikös ole järkevää tutkia ensin, pystyykö tiedostoon ylipäänsä kirjoittamaan??
Onko tuossa koodissa järkeä, vai miten asiantuntijat tiedoston luonnin ja avaamisen toteuttaisivat?
if (!file_exists($file_dir)) {
$file = fopen($file_dir, "a ");
echo "Tiedosto luotiin.";
} elseif (is_writable($file_dir)) {
$file = fopen($logfile_dir, "a ");
echo "Tiedostoon voitiin kirjoittaa.";
}
Tais tulla pieni väärinkäsitys. Tuota file_exists-functiota käytät vain silloin jos haluat tietää onko tiedostoa olemassa.
Mutta nythän sinun ei tarvitse sitä selvittää, sillä jos tiedostoa ei ole niin luot sen.
Tässä sulle pikkainen esimerkki "asiantuntijalta". Tein tuosta function jotta käyttö on helpompaa eikä tartte jokapaikkaan tuommoista tehdä.
Tuo myös lukitsee tiedoston jolloin muut eivät siihen pysty kirjoittamaan samaan aikaan, tämä aiheuttaa tiedoston tyhjenemistä. Tosin ainakin flock-functio ei toiminut kunnolla ihan aina, jolloin tiedosto saattoi tyhjetä vaikka se olisi "lukittu". Kaiketi tuo käyttää myös sitä functiota?
Siksi kannattaa käyttää tietokantaa mikäli tiedostoon kirjoitetaan usein ja samaan aikaan.
Kiitos vinkistä!
Mutta omassa tapauksessani eri käyttäjät kirjoittaisivat tuohon samaan tiedostoon ja varmasti myös samaan aikaankin. Näinköhän siinä nyt käy niin, että kun yksi kirjoittaa ja toinen on myös kirjoittamassa, niin tämän toisen kirjoittama data jyrää tuon ensimmäiseksi kirjoittaman datan?
Unohtui mainita, että sessiot ovat myös käytössä.
Jos kaksi käyttäjää yrittää täsmälleen samaan aikaan niin on mahdollista että data joko tuhoutuu tai sitten menee sekasin, johtuen juurikin tuosta, ettei PHP:n tiedoston lukitusfunctiot toimi kunnolla.
Idea tuolla lukituksella on, että kun käyttäjä suorittaa scriptin niin käsiteltävä tiedosto on varattu hänelle tarvittavan ajan eikä muut pääse väliin sotkemaan.
Usein tuota ongelmaa on kierretty että esim foorumissa viestit tallenetaan useaan eri tiedostoon eikä kaikkia samaan jne... riippuen siitä mikä tilanteeseen sopii.
Voit toki tehdä niin että teet tuollee ja käytät lukitusta vaikka se ei toimikkaan kunnolla, mutta esim CRONilla ajastettuna kopioit tiedostojen tiedot talteen vaikkapa kerran tunnissa, tällöin pystyt helposti palauttamaan tiedot jos ne tuhoutuu.
Mutta tietokannat ovat tuossa asiassa parempia ja niitä kannattaa käyttää mikäli mahdollista.
Sessiot eivät varsinaisesti vaikuta tässä asiassa mitenkään.