Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Diskusia k článku

Tip: správne includovanie súborovZobraziť článok

Greeg
Dátum a čas 28. 06. 2009, 11:43 E-mail greegus.virere [a] gmail.com

westrem: predstav si ze si v neznamom meste s mapou v ruke... v prvom pripade vyrazas do hotela zo stanice, v druhom ti niekto da satku na oci, privedie ta na opacny kraj mesta a 5x zatoci... v ktorom pripade do destinacie trafis skor?

Petr Kramář
Dátum a čas 11. 11. 2008, 12:17 E-mail petr.kramar [a] gmail.com

Jenom taková malá poznámka, v PHP 5.3.0 je zadefinována magická konstanta __DIR__ což je ekvivalentem dirname(__FILE__)

tomas masek
Dátum a čas 28. 08. 2008, 19:00 E-mail masek [a] altamira.sk

mas pravdu, za standardnych okolnosti by ta nemalo obmedzit ani pouzivanie relativnych ciest.

a v 99 % percentach beznych webov znizenu performance nikdy ani nepocitis :).

ale ked uz, kodit, tak kodit tak jak sa ma. a zo skusenosti viem, ze aj na prvy pohlad zbytocne veci dokazes neskôr poriadne ocenit. :)

westrem
Dátum a čas 28. 08. 2008, 02:19 E-mail westrem6 [a] gmail.com

heh neviem preco ale aj zdanlivo jednoduche veci ako je napr. tato ma nutia premyslat a analyzovat. Kukol som sa teda aj tomuto problemu hlbsie na koren. Pravdou je, ze ked sa pouziva relative path tak system vyhladavanei funguej nasledovne:

--For relative path includes it will search into default include path then current directory and so on--

Cize ano moze dojst k znizeniu performance u scriptu. Osobne som sa nad tym predtym nikdy nejako extra nezamyslal. Na druhej strane uz automaticky som zacal pouzivat nie relative paths ked sa jednalo o includovanie kniznic a inych veci. Pre nejaku jednorazovu prkotinku mam vecsinou relative vec ale ako teraz kukam pre masivne includovanie potrebnych kniznic definicci a settingov mam absolute path, sranda.

posledny dotaz este k tejto casti vety:
--nuz a samozrejme pokial zadavas cestu relativne, mas v kazdom foldri inu cestu.--

Ked si zoberiem fakt, ze vetsi projekt vetsinou stoji na tom, ze kazda jedna poziadavka ide cez nejaky ten index a potom sa urcitym frameworkom veci dalej spracuvaju (napr mcv pattern alebo podobne) tak predsa mame stale ten isty adresar a to adresar kde je umiestneny index. Vsetko co sa donho includuje a obsahuje odkazy na dalsie includovanie sa berie v ramci indexu a nie includovaneho suboru ak sa nemylim. Teda ak v index.php includnem subor napr. lib/lib_main.php a v nom includujem nejaku add kniznicu napr. lib/lib_db.php neznamena to, ze mam adresarovu strukturu:
lib/
lib_main.php
lib/
lib_db.php

ale

lib/
lib_main.php
lib_db.php

cim som len chcel povedat, ze sa nemusim starat o to v akom som adresari a davat si bacha na includovanie.

Tot asi vsetko, kazdopadne dakujem za dobru radu, ktoru som sice podvedome vyuzival ale iba teraz si ju aj uvedomil jej dosledok na performance :)

tomas masek
Dátum a čas 27. 08. 2008, 09:04 E-mail masek [a] altamira.sk

pokial zadas cestu relativnu, server ju musi dohladat, co sposobuje spomalenie. v pripade malych projektov to nic neznamena, ale v pripade velkych to uz je dobre zohladnovat. nuz a samozrejme pokial zadavas cestu relativne, mas v kazdom foldri inu cestu. a musis si ju komplikovane sam pisat. ked mas absolutnu cestu, je vsade rovnaka.

westrem
Dátum a čas 27. 08. 2008, 00:28 E-mail westrem6 [a] gmail.com

Mam jedinu otazku, preco je lepsie/efektivnejsie odkazovat sa na subor priamo ako relativne? Aky to ma dopad na vysledny efekt?

Naspäť naspäť

Pridať komentár

Koľko je na ruke prstov?

Náhľad článku

Tip: správne includovanie súborov

Používaniu funkcie include sa pravdepodobne dá len ťažko vyhnúť. Jej používanie je jednoduché, no v prípade veľkých projektov, pri ktorých je kladený dôraz najmä na rýchlosť aplikácie je treba optimalizovať kde sa dá. V prípade include je dobré zapamätať si pravidlo, že cesta k includovanému súboru by mala byť absolútna. Absolútna cesta je kompletná cesta k súboru v rámci adresárovej štruktúry, teda v prípade nejakého PHP/Apache balíka (napr. Wamp) nainštalovaného na Windowse by mohla vyzerať napríklad takto:

C:\wamp\www\adresar\subor.php

Jednou možnosťou je písať absolútnu cestu priamo do kódu:

<?
include 'C:\wamp\www\adresar\subor.php';
?>

Toto je však veľmi krátkozraké riešenie, pretože iná cesta je na localhoste, iná na produkočnom serveri. Aj preto veľa kodérov používa cesty relatívne. Riešením však môže byť použitie funkcie dirname, pričom zápis by mohol vyzerať aj takto:

<?
include dirname(__FILE__) . '/nazov_suboru.php';
?>

Konštrukcia dirname(__FILE__) vráti absolútnu cestu k adresáru, kde je uložený súbor, v ktorom je funkcia dirname zavolaná. Ďalej stačí dopísať cestu k includovanému súboru. Výstup takejto konštrukcie bude presne taký istý ako keby sme cestu zapísali „natvrdo“, avšak jeho použiteľnosť je zaručená na akomkoľvek serveri s ľubovoľnou adresárovou štruktúrou.

Ďalšou možnosťou je využitie serverovej premennej $_SERVER[‚DOCU­MENT_ROOT‘]. Tá vráti cestu k rootu na našom serveri a odtiaľ je jednoduché dopísať cestu ku konkrétnemu súboru. Riešenie môže vyzerať dobre, avšak vzhľadom na to, že vracia iba cestu k ROOTu, je ďalej nutné ručne dopísať cestu priamo k súboru. A to môže byť problém, ktorý by vzhľadom na odlišnosti adresárových štruktúr na rôznych serveroch mohol znamenať nefunkčnosť aplikácie.

<?
/* takáto konštrukcia nemusí pracovať vždy správne na každom serveri.
V premennej $_SERVER['DOCUMENT_ROOT'] je uložená absolútna cesta
k rootu, nie k adresáru, kde máme uložené súbory projektu
(napr. public_html alebo www alebo htdocs atď.)*/
include $_SERVER['DOCUMENT_ROOT'] . '/nazov_suboru.php';
?>
RSS