Portál AbcLinuxu, 10. května 2025 01:25

Dotaz: PHP: include konfigurace v prilinkovanem adresari

15.10.2009 11:22 ph0enix | skóre: 18 | Praha
PHP: include konfigurace v prilinkovanem adresari
Přečteno: 426×
Odpovědět | Admin

Ahoj, v jednom projektu jsem dospel do stavu, ze mam sadu skriptu pro zobrazovani statistickych dat jenz jsou stejne pro vice instanci a vystup je ovlivnovan pouze nastavenim konfiguracnich promennych. Dal jsem vsechny tyto soubory do samostatneho adresare a vytvoril na nej symbolicky odkaz. V tuto chvili ale resim jak spravne a elegantne vyresit nacitani konfigurace z nadrazeneho adresare.

proj1/
  config_vars.php
  stats => ../common/stats/
proj2/
  config_vars.php
  stats => ../common/stats/
common/stats/
  index.php

Bohuzel pokud v takto umistenem skriptu /proj1/stats/index.php chci nacist projektove specifickou konfiguraci pomoci include('../config_vars.php'), je tento soubor hledan v adresari common namisto proj1. Pokud vytvorim adresar stats a nalinkuji jednotlive skripty, vse funguje jak ocekavam. Touto cestou se vsak nechci ubirat nebot projektovych adresaru je k desitce a pocet skriptu jde take do desitek.

Mate nejaky napad jak to elegantne vyresit?


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.10.2009 21:20 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari
Odpovědět | | Sbalit | Link | Blokovat | Admin
include dirname($_SERVER['SCRIPT_FILENAME']) . '/../config_vars.php';

?
16.10.2009 10:22 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari

To bohuzel nefunguje. Je to ekvivalentni k include('../config_vars.php');. Pri pouziti teto konstrukce je nacten soubor /common/config_vars.php namisto ocekavaneho /proj1/config_vars.php (pokud se se ke skriptu pristupuje pres link v adresari proj1. Vypada to, ze nejprve se nahradi link a pak v takto ziskanem adresari udela krok do nadrazeneho adresare ve kterem hleda pozadovany soubor.

16.10.2009 10:44 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari

Zrejme jsem neco nepochopil... Shell se chova naprosto stejne. Pokud se nastavim do proj1 tak pozadavek na editaci souboru

vi ./stats/../config_vars.php

otevre soubor config_vars.php z adresare common namisto z proj1. Tedy jako by nahradil link fyzickym umistenim tj.

vi ./../common/stats/../config_vars.php

Muze mi to nekdo znalejsi vysvetlit? Toto chovani je pro mne docela neprijemnym prekvapenim.

16.10.2009 14:06 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari
Sice se toto chovani muze zda divnem, ale ve skutecnosti je jedine spravne. Problem totiz je ze konstrukce ".." neznamena nadrazeny adresar jak je uveden v ceste, ale znamena adresar, kteri je v aktualni adresari ulozen v souborovem system jako parent. Pr:
chocholj@cz995891 r $ ls -laRi
.:
total 16
4723576 drwxr-xr-x 4 chocholj users 4096 2009-10-16 14:56 .
4723905 drwxr-xr-x 30 chocholj users 4096 2009-10-16 14:56 ..
4732494 drwxr-xr-x 3 chocholj users 4096 2009-10-16 14:56 aa
4732737 drwxr-xr-x 2 chocholj users 4096 2009-10-16 15:00 bb

./aa:
total 16
4732494 drwxr-xr-x 3 chocholj users 4096 2009-10-16 14:56 .
4723576 drwxr-xr-x 4 chocholj users 4096 2009-10-16 14:56 ..
4732968 drwxr-xr-x 2 chocholj users 4096 2009-10-16 14:56 stats
4732965 -rw-r--r-- 1 chocholj users 4 2009-10-16 14:56 txt

./aa/stats:
total 8
4732968 drwxr-xr-x 2 chocholj users 4096 2009-10-16 14:56 .
4732494 drwxr-xr-x 3 chocholj users 4096 2009-10-16 14:56 ..

./bb:
total 12
4732737 drwxr-xr-x 2 chocholj users 4096 2009-10-16 15:00 .
4723576 drwxr-xr-x 4 chocholj users 4096 2009-10-16 14:56 ..
4139335 lrwxrwxrwx 1 chocholj users 11 2009-10-16 15:00 stats -> ../aa/stats
4732967 -rw-r--r-- 1 chocholj users 4 2009-10-16 14:56 txt
chocholj@cz995891 r $ ls -laRi bb/stats/
bb/stats/:
total 8
4732968 drwxr-xr-x 2 chocholj users 4096 2009-10-16 14:56 .
4732494 drwxr-xr-x 3 chocholj users 4096 2009-10-16 14:56 ..

Oznacene adresare jsou vsechny stejne (pozna se to podle cisla inode):
./aa = ./aa/. = ./aa/stats/.. = ./bb/stats/..
16.10.2009 11:18 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tak jsem to vyresil pomoci generovani kodu a volani eval(). Vytvoril jsem si funkce na normalizaci cesty a generovani PHP kodu jenz ulozi do zasobniku prave vkladany soubor, provede include a uklidi zasobnik. Pomocne funkce a inicializace zasobniku vypadaji nasledovne

// oprava cesty
function file_path_unify($param_filename) {
  $param_filename = str_replace('\\', '/', $param_filename);
  $param_filename = preg_replace('/\/+/', '/', $param_filename);
  $param_filename = str_replace('/./', '/', $param_filename);
  $param_filename = preg_replace('/\/[^\.\/]+\/\.\.\//', '/', $param_filename);

  return $param_filename;
}
// vygenerovani kodu pro include
function get_relative_include($param_filename, $param_once = 0) {
  $result  = 'array_push($INC_STACK, file_path_unify(dirname($INC_STACK[count($INC_STACK) - 1]) . "/" . "' .
    $param_filename . '"));';
  if ($param_once) {
    $result .= 'include_once($INC_STACK[count($INC_STACK) - 1]);';
  } else {
    $result .= 'include($INC_STACK[count($INC_STACK) - 1]);';
  }
  $result .= 'array_pop($INC_STACK);';

  return $result;
}

// inicializace zasobniku volani
$INC_STACK = Array($_SERVER['SCRIPT_FILENAME']);

Ve vlastnim skriptu /proj1/stats/index.php pak konfiguracni soubor nactu pomoci

eval(get_relative_include("../config_vars.php"));

Takto mohu soubory vkladat ve vice urovnich zanoreni a ve vsech pouzivat relativni cesty k aktualne provadenemu souboru se zachovanim cesty pres kterou jsem se k souboru dostal a nikoliv k jeho fyzickemu umisteni na disku.

16.10.2009 12:46 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari
Nestacilo by dat nekam na zacatek ini_set('include_path', ini_get('include_path') . ':' . dirname($_SERVER['SCRIPT_FILENAME']));? Prijdeme mi trochu prasacke kvuli takovehle blbosti pouzivat eval.
16.10.2009 14:45 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari

To bohuzel nevyresi pozadavek na vlozeni souboru z nadrazeneho adresare. Taktez zrejme bude problem v pripade, ze soubor stejneho jmena je i v aktualnim adresari.

Řešení 1× (ph0enix (tazatel))
16.10.2009 16:42 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dostat se v cestě o jeden adresář výše přece jde i bez použití "..". Stačí třeba použít dirname dvakrát:

include dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/config_vars.php';

IMHO je na tak jednoduchý problém zbytečné vymýšlet kejkle s nějakou globální proměnnou, *_replace a (chraň Tučňák!) eval :-)
AraxoN avatar 16.10.2009 18:05 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari

jj, eval() je zlo.

K pôvodnej otázke: ja to riešim tak, že spoločné skripty sú len na jednom mieste, a odkaz na toto miesto sa napíše do configu.

19.10.2009 09:34 ph0enix | skóre: 18 | Praha
Rozbalit Rozbalit vše Re: PHP: include konfigurace v prilinkovanem adresari

Tohle reseni mne nenapadlo. Diky.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.