funkce realpath() a is_dir() apod.

Může mi prosím někdo poradit co mám dělat s tím, když mi funkce realpath(), is_dir() apod. vrací FALSE, i když adresář existuje?

Výpis chyby:
Strict Standards: realpath() [function.realpath]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CET/1.0/no DST' instead in /3w/wz.cz/j/janaatom/test/index.php on line 234

Warning: realpath() [function.realpath]: open_basedir restriction in effect. File(/3w/wz.cz/j/janaatom/test/system) is not within the allowed path(s): (/3w) in /3w/wz.cz/j/janaatom/test/index.php on line 234

nebo

Strict Standards: is_dir() [function.is-dir]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CET/1.0/no DST' instead in /3w/wz.cz/j/janaatom/test/index.php on line 252

Warning: is_dir() [function.is-dir]: open_basedir restriction in effect. File(system/) is not within the allowed path(s): (/3w) in /3w/wz.cz/j/janaatom/test/index.php on line 252

Díky tomu mi nefunguje celý systém (používám framework CodeIgniter). Psal jsem dotaz na "podpora@webzdarma.cz" 9.3. a do dnešního dne mi neodpověděli.

Díky
http://php.net/manual/en/ini.core.php#ini.open-basedir

Vysvětlení je snad dostačující, a zdůvodnění nejspíš zřejmé -- využitím nastavení php.ini je záměrně zakázán přístup kamkoliv nad uživatelskou složku.

Pokud je volání realpath() a is_dir() přímo někde v CodeIgniteru, tak reklamuj na jejich fóru; při nastavení open_basedir to fungovat nebude. Pokud vé tvém kódu, tak opravuj.

Co se týče "Strict Standards:.. It is not safe to rely on the system's timezone settings.." snad netřeba rozebírat, chybová hláška je samovysvětlující. Nejjednodušší způsob je volání funkce date_default_timezone_set() na začátku skriptu.
Kdyby byl na tomto webu normálně nastavený DOCUMENT_ROOT tz. místo na "/3w"správně na "/3w/wz.cz/j/janaatom/". Tak by vše fungovalo jak má a nemuselo by se nikde nic měnit a opravovat.

Co se týče chybové hlášky "timezone settings", tak to si myslím, že je chybou PHP, když hlásí chybu "Strict Standards". To jsem jen okopíroval celé chybové hlášení.
Ještě jsem zapomněl, že by v ini.php mělo být v "open_basedir" doplněno "/3w/wz.cz/j/janaatom" ;-)
Normální nastavení DOCUMENT_ROOTu neexistuje! Zvlášť pokud se používá jedna instalace PHP pro několik webů/domén. Nastavení pouze "/3w" je zcela v pořádku. (Pro doplnění jenom dodám, že ani žádné nastavení Apache na hodnotu DOCUMENT_ROOT nemají vliv, ani virtual_host.)

Pokud někdo opravdu potřebuje znát document root, tak by k tomu měla sloužit hodnota CONTEXT_DOCUMENT_ROOT; ta je závislá přímo na Apachi.. ale předpokládám, že místní stará verze Apache ji nenabízí. Tady platí další odstavec.

Standardní postup jak získat document root od PHP 5 je přes magic konstantu:
define ('DOCUMENT_ROOT', dirname(__FILE__));

Nic víc, nic míň.

A open_basedir je znova stejná písnička. Opět se nastavuje pouze jednou pro celou instalaci PHP. A není asi překvapením, že "/3w" je nejbližší společný adresář pro všechny uživatele na webzarma.

Na závěr, varování ohledně Strict Standards není chybou PHP, je to jasně podané upozornění. Od verze PHP 5.3.0 (pokud se nepletu) prostě vyžaduje nastavení časového pásma/timezone. Co třeba místo stěžování si na možnou chybu PHP jej nastavit? Jedna funkce a vyřešeno.

> Tak by vše fungovalo jak má a nemuselo by se nikde nic měnit a opravovat.
Když to někdo od začátku napíše tak, že se spolehne na nestandardní nastavení PHP, tak je to bohužel jenom jeho vlastní problém.
Strict Standards: Tato hláška se objevuje při použití E_STRICT v error reportingu.
V tomto případě to způsobuje zřejmě framework v aplikaci nebo v .htaccess, který povýšil chybové hlášky i o tuto úroveň. Mělo by stačit toto najít a vyloučit.

V PHP: error_reporting(E_ALL & ~E_STRICT & ~E_NOTICE);
V .htaccess: php_value error_reporting 30711

Případně udržet strict a doplnit date.timezone.


open_basedir restriction: To spíše značí na špatně napsaný framework nebo chybné nastavení aplikace. Jednoduše aplikace sahá tam, kam nemá. I když adresář existuje, tak k němu nemáš přístup, proto FALSE. DOCUMENT_ROOT neobsahuje správnou hodnotu, a to je také hlavní příčinou, ale aplikace na tuto hodnotu nesmí být závislá, protože není spolehlivá. DOCUMENT_ROOT nezaručuje, že daná cesta je cestou aplikace. A jak koukám, tak i kdyby byla hodnota správná, tak aplikace stejně selže. Protože aplikaci máš v podadresáři test a aplikace by hledala v rootu, kde však nic nenajde.

V php.ini v žádném případě nemůže být tvoje cesta, protože by pak nefungovaly žádné weby na WZ ;) php.ini je společný pro všechny. Aktuální hodnota base_dir je správná a adekvátní. Tvoji cestu tam zastupuje tečka.

Takže co s tím. Prozkoumat dokumentaci frameworku a hledat něco co nastavuje cestu k aplikaci. Tedy obejít použití DOCUMENT_ROOT a místo toho použít vlastní cestu.