php teljesitmeny kerdes

van egy config.php script, amit egy site osszes scriptje meghiv (a 3. sorban, ha ez szamit :-)). Ebben van 50 defined konstans, pl. define('A', 123);

Namost egy olyan igeny jott, hogy szeretnek, ha a lokalis, site-specifikus valtozok egy kulon file-ban legyenek megadva, pl. igy:


require_once 'site-config.php';

define('A', ...);
...

1 aprocska gubanc van: a konstansokat nem lehet feluldefinialni, kulonben egy notice uzenet a jutalom erte. Ezert 2 workaround jutott eszembe:

A) legyen a config.php-ban minden konstans elott egy csekkolas, hogy letezik-e mar ilyen konstans (a site-config.php-bol). Ha nincs, akkor adunk neki erteket:


if(!defined('A')) define('A', ...);
if(!defined('B')) define('B', ...);
...

B) a masik megoldasnal nem foglalkozom ezzel a csekkolassal, hanem egyszeruen kikapcsolom a notice hibauzeneteket:


require_once 'site-config.php';

ini_set("error_reporting", E_ALL & ~E_NOTICE);

A kerdes az, hogy melyik megoldas ad nagyobb teljesitmenyt? Vagy megforditva: melyik megoldas terheli jobban a php-t? Gondoljunk egy nagy forgalmu site-ra, ahol minden usec szamithat a feldolgozas soran.

Hozzászólások

Amikor utoljára foglalkoztam ezzel, akkor még sokan szidtál a php konstansokat, mert hogy nagyon lassú. Lehet érdemes lenne változókra cserélni.

Egyébként a

if (!(defined('abc'))) define('abc', 123);

talán nem olyan lassú.

Komolyan az 50 konstans letrehozasa a legnagyobb baj? :)

1) Miert konstans?
2) inkabb ne noticeoljon, az meg mehet fajlba is, ami nincs tul jo hatassal a teljesitmenyre.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Most tekintsünk el attól a zagyvaságtól hogy site-specifikus valtozok-ként hivatkozól a konstansokra! De sajnos még így is zagyvaság az egész, hisz pont arról van szó, hogy kulon file-ban legyenek megadva az értékek - ergo nem kell attól tartani, hogy bármi felül lesz definiálva, hisz nincs mit felüldefiniálni, ha már egyszer külön lesz megadva site-onként...
Ezek után gondoljunk egy nagy forgalmú site-ra! Bravó!

Nem a PHP teljesítményével miatt kéne aggódni, hanem értelmesen kell fogalmazni! Ugyanis ennek premisszája a probléma átgondolása, amit még a "nagy forgalmú site" varázsige kimondásával sem lehet elkerülni.

Tehát a kérdés az, hogy miért lenne "A" site-specifikus konstans, ha az a config.php -ban és nem csak a site-config.php -ban van definiálva?

zagyvasag a te fejedben van, baratom. De hogy egy kicsit okosabb legy, mint amikor idejottel: adott egy szoftver konfigja, amit telepiteskor testre szabsz, beleirod a domained nevet, IP-cimet, stb. Majd amikor kijon a szoftver ujabb verzioja, ami adott esetben uj konfig valtozokat is hoz az uj feature-okhoz kapcsolodoan, akkor maceras a felhasznaloknak a felulirni a config.php-t, majd megint atirni azt a 10-15 az adott site-re jellemzo valtozot. Ez a problema, amire egy relative hatekony megoldast keresek.

De lehet, hogy az lesz belole, hogy majd egy upgrade.php beleirja az ujdonsagokat, oszt kalap, kaftan.

Diktatorok kezikonyve

Aham. Látatlanban: erre inkább egy minden szempontból átgondolt megoldást keressél! A hatékonyság a kevésbé fontos szempontok egyike.
Ha a feladat az, hogy hogy lehet megvalósítani a konfigurációs értékek automatikus updatet-jét, akkor csak egy zagyva fejű barát gondolhatja komolyan, hogy a lényegi kérdés az, hogy most az 'IF' vagy az error reporiting baszkurálás eredményez gyorsabb futást.

Úgy tudom, hogy a php hibakezelése, akkor is lefut ha "lenémítod", ami erőforrás igényes lehet. Az "if" -es vizsgálat szerintem gyorsabb.

Az otlet zavar, hogy kapcsoljuk ki a figyelmeztetest, es akkor nincs hiba. Ez nem errol szol. Ha holnaptol a PHP fejlesztok ugy dontenek, hogy tobbe nem leszek feluldefinialva a konstansok, akkor mi van? Leven hogy a notice pont ezt mondja, hogy nem lehet oket feluldefinialni. Az, hogy most sikerul, az egy dolog, de erre nem jo szamitani. Elvben ennek undefined behavior-nak kellene lennie.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Ez esetben nincs ertelme a workaroundnak. Ha az appod barmikor konstanst akar felulirni, akar csak az eselye felmerul, akkor vagy nem arra hasznalod a konstansokat, amire valok, vagy rossz az alkalmazas tervezese. Ezt a problemat megoldani kell, nem koruldolgozni.

Egyebkent en nem tartom jo otletnek az alkalmazas konfigjat konstansokba menteni. Tudom, hogy a PHP-s vilag nagyobbik fele igy tesz, ettol ez meg nem lesz jo otlet. Olyan szepen meg lehet ezt oldani egy darab singleton class-sal, vagy egy fuggvenybe csomagolt hash-sel (ha nagyon nem akarsz OOP-t), hogy a konstansokba mentes azok mellett csunyanak es ertelmetlennek tunik.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Ha van egy értékem, ami a program futása alatt nem változhat meg, akkor a konstans a leginkább megfelelő nyelvi elem a reprezentálására - minden további hókuszpók csak ezen egyszerű megoldás [szükségtelen] elbonyolítása. A kérdező valódi problémája nem az, hogy a program futása során nem lehet megváltoztatni a konstans értékét, hanem az, hogy a program futásán kivül sem tudja ezt megtenni.

#define program_futasa. A program attol kezdve fut, hogy a php meghivja, es addig fut, amig a megfelelo php processz kilep. Ez a program futasa. A program futasan kivul pedig egy editor okszeru hasznalataval barmikor megvaltoztathato a kert ertek.

A kerdesbol szamomra egyertelmuen derul ki, hogy konfiguracios beallitast szeretne eszkozolni. Tehat nem ilyen APP_PATH, DIRECTORY_SEPARATOR, es hasonlo cuccokat, amire a konstans egyebkent valo, hanem konfiguraciohoz, amire viszont az nem valo.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

ha ragaszkodsz a konstansokhoz:


$config['foo'] = 'bar';
$config['csigabiga'] = 'batkamano';

foreach ($config as $k => $v) {
  define($k, $v);
}

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

nem-nem, nekifutok megegyszer.

van egy program, aminek a konfigja egy csomo define()-ban van a default ertekekkel. Ezt a userek (akik telepitik es beallitjak, nem pedig akik hasznaljak!) kedvukre testre szabjak. Eddig szep es jo. De jott egy olyan keres, hogy x db default erteket hadd valtoztassanak meg ugy, hogy ha a default pl. define('A', 5) de o beallit define('A', 8)-t, akkor az a helyi (sitespecifikus) ertek legyen az A erteke (=8), es ne a default (=5). Ha nem biralja felul A-t, akkor annak 5 az erteke tovabbra is.

Jelenleg ez megoldhato ugy, hogy a config.php elejen behuzom a site-config.php-t, amiben a sitespecifikus ertekek vannak, es mivel egy konstanst nem lehet felulirni, igy ez jol is mukodik. 1 aprosag van: ha felul probalsz irni 5 konstanst, akkor 5 notice uzenetet kapsz erte, amit el kene kerulni, mert a hibakezelessel ne menjen el az ido.

Erre egy lehetoseg az, hogy a config.php-ban minden define() elott megnezem, hogy vajon definialva van mar: if(!defined(...)) define(...)

De amint azt fentebb is mondtam, lehet, hogy az lesz, hogy a user telepiteskor hadd tekerje kedvere a konstansokat, majd amikor verziofrissites jon, akkor egy upgrade.php script ebbe irja bele az uj dolgokat, igy nem kell ujra es ujra a default konfigban tekergetni a mar korabban megvaltoztatott ertekeket.

Diktatorok kezikonyve

Én kisfiú vagyok, lehet ezért nem értem, hogy hol itt a kérdés...
Ugye állítólag nagy a forgalom, fontos a teljesítmény. Nem tudom, hány konfigurációs konstansod van, de ha sok, akkor a minden oldalletöltésnél való összefésülés egy teljesen felesleges overhead.
Én szívem szerint úgy csinálnám, ahogy a hozzászólásod végén írod. Ha az offline működés nem megfelelő, akkor verzióztatnám a userekkel a saját konfigjukat, induláskor azt nézném meg, hogy változott-e a verzió, és ha igen, akkor fésülném össze a két configot egy harmadikba, amit aztán includeolnék. Vagy valami ilyesmi.

Azon kívül, hogy már sokan (jogosan) megírták, hogy hülyeség a konstansokat erre használni, az esetleg nem jutott eszedbe, hogy először húzd be az user konfigját, utána a defaultokat, ha még nincs definiálva? :)

De tökmindegy, nem erre valók a konstansok. Erőlködhetsz itt, de attól még te akarsz hülyeséget.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

a configod legyen egy tomb.
a tobbit radbizom.

Lehet overkill, de mi lenne, ha csinálnál egy default konfigot. Azt beolvassa a script, majd az egyéni beállításokat is beolvassa és a kettőt mergéli?

De miért nem használsz változókat?