Lex
2005. június 24. 14:10
Sziasztok!
A probléma a következő:
A weboldalam /log könyvtárában van egy szöveg állomány és egy php progi, ami ebbe a szövegállományba naplóz. A php progit más könyvtárakból include()-olom és a benne lévő naplozas() fv-t hívom meg. A progiból nem tudom hogyan kellene az fopen-hez a szövegállomány elérési utját megadni, hogy bárhonnan hívom meg, mindig megtalálja a log könyvtárbeli szöveg állományt. Ha a gyökérből hivatkozok (/log/allomany.txt), akkor nem működik. Ha pl. $_SERVER['DOCUMENT_ROOT'] . "log/allomany.txt" sem ad jó eredményt, bár a saját gépem szerverével működik.
Az include-olt progi egy részlete:
KÓD
$allomany="/log/naplo.txt";
if (! file_exists($allomany) )
touch($allomany);
$f=fopen($allomany,'a');
arpsoft
2005. június 24. 14:31
Az include helyett használjál require-t.
Lex
2005. június 24. 14:42
Ha jól tudom, akkor az az include-tól annyiban különbözik, hogy ha nem találja az includolandó file-t, akkor nem figyelmeztet, hanem kiakad hibával.
PHP Kézikönyv Require()Vagy nem jól tudom?

PS: Nem az include-dal van bajom, hanem az fopen-nel! Nem ezt értetted félre? Kicsit átfogalmaztam a témaindítót, hogy érthetőbb legyen.
arpsoft
2005. június 24. 14:44
Nem egészen ez a különbség.
Az include megkeresi a fájlodat és lefuttatja, míg a require úgy dolgozik, mintha ott lenne a kódban az importált függvény.
Lex
2005. június 24. 14:49
Ezzel nincs is semmi bajom, csak pl. a /munka1 könyvtárban lévő prog1.php állományba beinkludolom a /log/naplozas.php állományt, de ez ugyebár a /munka1 könyvtárban fut.
Majd pl. a /munka2 könyvtárban lévő prog2.php állományba is inkludolom a /log/naplozas.php állományt, de ez ugyebár a /munka2 könyvtárban fut.
A naplozas.php állomány mindig más könyvtárban fut, ezért a benne lévő fopennek nem tudom hogy adjam meg a /log/naplo.txt file elérési útját.
Ezt a hibaüzit adja:
Warning: fopen(): open_basedir restriction in effect. File(/log/belepes.txt) is not within the allowed path(s): (.:/disk/raid2/l/o/logex) in /disk/raid2/l/o/logex/log/naplozas.php on line 20
Warning: fopen(/log/belepes.txt): failed to open stream: Operation not permitted in /disk/raid2/l/o/logex/log/naplozas.php on line 20
arpsoft
2005. június 24. 14:52
Na ez a require előnye. Az ott fut, ahol a require van.
Lex
2005. június 24. 14:58
Az include is a hívó progi könyvtárában fut. Kipróbáltam require-vel.
Ezt köpte rá:
Warning: fopen(belepes.txt): failed to open stream: Permission denied in /disk/raid2/l/o/logex/log/naplozas.php on line 20
Ez azért van, mert a főkönyvtáram index.php-jába includoltam és oda nincs írási joga. De nem is kell, mert a log könyvtárba kéne írnia.
Hagyjuk a require-t és az include-ot. Nem az a hiba.
Az fopen-nél hogyan tudok a gyökértől hivatkozni egy állományra?
arpsoft
2005. június 24. 15:25
Van egy ilyen lehetőség: fopen("valami.txt","a+",1)
Ilyenkor a php.ini-ben beállított útvonalon keres.
De megadhatod neki a teljes elérési utat, pl
fopen("http://akarhol/akarmi.txt","a+")
Lex
2005. június 24. 15:46
A Freeweben nem hiszem, hogy beletúrhatnék a php.ini-be!
A teljes elérési út esetén (http://logex.fw.hu/log/naplo.txt) ezt kapom:
Warning: fopen(): URL file-access is disabled in the server configuration
Légyszíves ne használj piros színt a hozzászólásodban és ne idézd be az előtted íródott hozzászólást! <PF>Ha nem szabad idézni, akkor minek hozza be - ha kérem, ha nem - ez a frankó IPB?
arpsoft
2005. június 25. 11:11
Azért, mert válaszolsz. A hozzászólásod alatt ott van az idézet egy másik szövegablakban.
Ha a "Szólj hozzá"-ra kattintasz, akkor nem idéz.
Lex
2005. június 25. 17:42
@arpsoft: OK.
Jobb megoldás hiányában egyenlőre az alábbi megoldást alkalmaztam a gyökérkönyvtár megállapítására:
KÓD
$root=substr($_SERVER['SCRIPT_FILENAME'] , 0, strpos($_SERVER['SCRIPT_FILENAME'], $_SERVER['SCRIPT_NAME']));
if (isset($_SERVER['HTTP_X_FW_USERNAME']))
$root=$root . '/' . $_SERVER['HTTP_X_FW_USERNAME'];
$root=$root . '/';
Ez működik localhost-on és a szerveren is.
Tud valaki egyszerűbbet?
ocsi
2005. június 26. 21:11
Lehet hogy én olvastam pontatlanul, de miért akarsz minden áron relatív hivatkozást?? Nem űködik az hogy thotbalasz.fw.hu/log/naplozas/naplo.txt ???( vagy lehet h a freeweb is csinál egy kanyart az abszolút hivatkozásokban mint az srv...)
arpsoft
2005. június 27. 7:50
Ezért nem tudja:
IDÉZET
A teljes elérési út esetén (http://logex.fw.hu/log/naplo.txt) ezt kapom:
Warning: fopen(): URL file-access is disabled in the server configuration
Lex
2005. június 27. 11:18
A Prog.hu-n (ha szabad itt ilyet mondani?

) egy kicsit egszerűbb választ már kaptam. A
KÓD
dirname(__FILE__)
megadja a beinclude-olt állomány eredeti könyvtárát, tehát ez állandó, függetlenül attól, hogy honnan includolom. De ez még mindig nem a gyökér. Tudom, tudom, hogy ebből kiszedhető, de valahogy nem tudom elképzelni, hogy nincs egy normális, "hivatalos" módszer erre.
Közben még az jutott eszembe, hogy a Linuxban, ~ jellel jelölik a felhasználó home könyvtárát. Kipróbáltam, de sajnos nem működik ezzel sem.
arpsoft
2005. június 27. 12:43
Létezik ez a változód?
$REDIRECT_HOMEDIR vagy _SERVER["REDIRECT_HOMEDIR"]
Lex
2005. június 27. 18:57
Nem. A $_SERVER-t teljesen átnéztem:
PATH_TRANSLATED=SCRIPT_FILENAME= a teljes elérési út a szerver gyökerétől.
SCRIPT_NAME=REQUEST_URI=PHP_SELF= elérési út a user könyvtárral.
Van még a DOCUMENT_ROOT, de az /home/freeweb/, ami nem jó.
A többi más jellegű.
Ez a tartalom egy lebutítottváltozata. A teljes változat képekkel kiegészült megtekintéséhez kérünk,
kattints ide.