- Karácsonyfaként világíthat a Thermaltake új CPU-hűtője
- Az USA vizsgálja a RISC-V kínai terjedésének kockázatát
- Kicsit extrémre sikerült a Hyte belépője a készre szerelt vízhűtések világába
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Kihívás a középkategóriában: teszten a Radeon RX 7600 XT
Hirdetés
-
Karácsonyfaként világíthat a Thermaltake új CPU-hűtője
ph Az ASTRIA 600 ARGB ráadásul a hűtési teljesítmény szempontjából sem szégyenkezhet.
-
Toyota Corolla Touring Sport 2.0 teszt és az autóipar
lo Némi autóipari kitekintés után egy középkategóriás autót mutatok be, ami az észszerűség műhelyében készül.
-
Samsung Univerzum: Így ismerhető meg a Galaxy AI bármilyen telefonon
ma A Try Galaxy webalkalmazás kontrollált környezetben mutatja meg, mit tud a One UI 6.1-es rendszer és a mesterséges intelligencia.
Új hozzászólás Aktív témák
-
modder
aktív tag
Heló,
Kell csinálnom AJAX technikával egy "chat" vagy üzenőfal progit egy site-ra.
Ez csak a legalapabb funkciókat fogja tartalmazni, tehát 1 "szoba" lesz ahová mindenki írhat.mielőtt a kérdésre térnék leírom én hogyan képzeltem el:
Kliens
a kliens az oldalon először beírja nicknevét, e-mail címét, utána chatelhet.
a kliens oldalon a javascript kód <= 1 másodpercenként kérést intéz a szerver felé, hogy jött-e új üzenet, ha jött, a szerver (php progi) küldi az eltelt idő alatt érkezett üzeneteketSzerver
Itt egy adatbázis memory vagy innodb táblában tárolom az üzeneteket, esetleg másik táblába vagy fájlba loggolom bizonyos időközönként. A kliens kérésére a legutóbbi üzeneteket elküldöm neki.Az egész procedúra miértjét/hogyanját még kitalálom, nem árt a gyakorlás, meg úgyis van csomó kód amit leszedhetek a netről.
A kérdés: Tehát az előbbiek szerint a kliens <=1 másodpercenként kérést intéz a szerver felé. Na most ha pl 20 ember chatel akkor ez mennyire terheli meg a szervert? Illetve webhosting szolgáltató hogy értékeli az ilyet, például alapból limitálva van a processzor időm és belassulhat az egész site emiatt? Ez a fő kérdés
Esetleg ti hogyan oldanátok meg? Most még az jutott eszembe, hogy ha valaki küld új üzenetet akkor és csak akkor a script kiküldené az összes aktív kliensnek, na de hogy oldom meg, hogy apache csak úgy küldjön adatot kérés nélkül a klienseknek... Ezek meg a "mellék kérdések"
Köszi a válaszokat
-
modder
aktív tag
találtam egy nagyon jó cikket: http://www.devshed.com/c/a/PHP/Socket-Programming-With-PHP/
szerintem ez alapján fogok csinláni php-ben egy kis szervert ami kezeli az egészet, így nem fogja fölöslegesen terhelni a webszervert szerver oldalon.
mivel kliens oldalon csak javascript áll rendelkezésemre és abban (e szerint itt: http://bytes.com/forum/thread533816.html ) nincs socket handling ezért marad a kb másodpercenkénti kérés a szerver felé.
Az előző kérdésemre a webhosting szolgáltatóval kapcsolatban azért még várok válaszokat =)
[ Szerkesztve ]
-
modder
aktív tag
Köszi a választ.
Igen, elég kicsi az adatmennyiség tulajdonképpen csak maximum pár száz karakter kérésenként. A hangsúl itt inkább azon van, hogy 1 ilyen oldal másodpercenként produkálhat kb 20-30 a szerver felé ami átmegy apache>php>mysql mindenen.
Ezért jutott eszembe, hogy levehetném a fölösleges terhelést apache-ról, ha írnék egy állandóan futó scriptet, amit a legutóbbi hozzászólásomban írtam. Bár ezt nehezebben veszi be a webhosting szolgáltatóDe ha állításod szerint ez a 20-30 kérés még nem olyan sok másodpercenéknt, akkor lehet maradok a "hagyományos" 1script futás/kérésnél.
-
modder
aktív tag
válasz #34784256 #1722 üzenetére
Erre írsz egy egyszerű javascriptet.
Az ablak x és y koordinátáinak, méretének stb. meghatározásához megkeresed google-n a megfelelő függvényeket.
majd ahová a linket szeretnéd elhelyezni írsz egy:<script language="javascript">
x = this.function_of_x_whatever();
y = this.function_of_y_whatever();document.write("<a href=\"proba.php?x=" + x + "&y=" + y);
</script>
nem nagyon értek javascripthez, de egy hasonló kódnak ez lesz a hatása. (ez elég bizalomgerjesztően hagnzott, kb: el se olvasd a hozzászólásom )
arra vigyázz, hogy a javascript write függvényben NE legyen sortörés csak \n karakter.
Ezzel nagyon sokat szívtam.MOD:
Talán szebb megoldás, hogy a html kódba simán beírod, hogy <a href=# onclick="uj_php_oldal()">Blabla</a>
és a html kód <head> közé írod be a javascript kódot ami tartalmazza az uj_php_oldal() függvényt ami meghívja az új oldalt stb.
[ Szerkesztve ]
-
modder
aktív tag
Tuladjonképpen a cikkben amit már belinkeltem:
http://www.devshed.com/c/a/PHP/Socket-Programming-With-PHP/pont php-val old meg egy "kis saját webszervert"
socketet használ, és beteszi loopba az egészet. shell-ből meghívja, azt csá
ott figyel örökké, és válaszol ha kell. Nyilvánvalóan egy szerver applikációhoz nem php a megfelelő megoldás, de amíg nem több száz felhasználót kell egyszerre kiszolgálni, addig ez is tökéletesen megteszi, és annyit gyorsít a dolgon, hogy nem veszi igénybe a webszervert + nem fog minden egyes alkalommal lefordulni, hanem miután elundul megy.Kipróbálnám ezt a megoldást szívesen, de egy mezei webhosting szolgáltató nem fogja engedni hogy futtassak egy ilyet nem virtuális szerver környezetben, úgyhogy marad a sima php script ami minden egyes alkalommal meghívásra kerül.
-
modder
aktív tag
válasz #34784256 #1725 üzenetére
hát igen, ez nem éppen php-s kérdés volt. de aki webfejlesztéssel foglalkozik előbb-utóbb -főleg manapság amikor már minden böngésző jól ismeri a javascriptet- szembe tallja magát olyan feladatokkal amihez elengedhetetlen a javascript használata, ennélfogva meg kell tanulni egy erős alapszintű javascript programozást (scriptelést) amire már lehet alapozni.
De a különböző böngészők kezelésére is van megoldás, például még html szinten van valami hasonló tag, hogy <if IE></if IE> az e között levő kód csak akkor hívódik meg, ha a böngésző Internet Explorer, és e közé lehet írni az IE alá szánt javascript kódot.
-
modder
aktív tag
apropó, már régen próbáltam, de hogyan tudom változtatni a személyes beállításaimat itt a fórumon? jobboldalt a beállításokra kattintva csak a fórum megjelenésére vonatkozó adatokat tudom módosítani.
-
modder
aktív tag
válasz Speeedfire #6942 üzenetére
Helló,
Nem mindegy, hogy milyen fordítású apache van fönt. Amennyit én tudok, a prefork verzió childprocesseket hoz létre, amíg a worker verzió szálakat.
Olvasd el ezt: http://httpd.apache.org/docs/2.0/mpm.html
Ha prefork verzió van fönt, a MaxSpareThreads nem játszik.Itt van a prefork által elfogadott paraméterek: http://httpd.apache.org/docs/2.0/mod/prefork.html
Nem tudom milyen megfontolásból tetted a routerre, ha otthon baszkódsz vele és kíváncsiságból, akkor nem gond, de azért vállalati környezetben ne csinálj ilyet
Még eljátszogathatsz az apache process nice érékével is, hogy ha hálózati forgalom szempontjából a router keményen igénybe van véve, az oldallekérdezések ne fogják vissza, de az is lehet, hogy erre nincsen szükség.
Nem vagyok egy nagy apache guru, de megpróbálkozhatsz olyannal is, hogy ne töltsön be modulokat, amik nem kellenek, pl. ssl.
-
modder
aktív tag
válasz Sk8erPeter #7980 üzenetére
de igen: curl http://domain/drupalinstall/cron.php ^^
ezt told be ütemezőbe. vagy akár egy wget. -
modder
aktív tag
Általában egyetértek azzal, hogy "a PHP szorosan összekapcsolódik a gányolással", a tipikus Pistike (elnézést a Pistikéktől ) megtanul PHP-ban programozni, és honlapokat "fejleszt".
Azonban ma már nem csak arról szól a webprogramozás, hogy PHP+Apache+MySQL, hanem REST API-k, különböző szintű cache-k, elosztott adatbázisok (pl. MongoDB), AJAX, PUSH notification, cloud storage-ek (Amazon S3), OR mapping.
Vannak szofisztikált PHP mvc frameworkok (Kohana, amivel most én dolgozgatok).Ezek használata elég sok tervezést igényel architektúrális szinten, és ma az újragondolt OO-val a PHP teljesen alkalmas egy komplex rendszer létrehozására. Lásd, Doclernél még mindig PHP-ban írják a backend nagy részét, és sok nagyvállalatnál is.
A kérdés nem az, hogy PHP vagy Java EE vagy C#, hanem az, hogy képes vagy-e elsajátítani azt a készséget, hogy megfelelően megtervezd az alkalmazásod, és fegyelmezett, jól körülhatárolt szerepkörökkel rendelkező moduláris kódot alkoss. Ehhez bizony sokat kell kódolni, más kódját, tervezési mintákat, architektúrális mintákat kell tanulmányozni.
Aztán ha elhiteted állásinterjún, hogy te bizony értesz mindezekhez, és tényleg értesz, akkor nem leszel alulfizetve, és vezető fejlesztő leszel
Egyébként én is már jó ideje Java EE felé kacsintgatok, mert nagyon kényelmes és kifinomult megoldások vannak már benne specifikáció szinten. pl. JSF, EJB-k, JPA.
-
modder
aktív tag
Az a baj még a "szeretnék megtanulni programozni" kérdésekkel, hogy sokan elfelejtik, hogy a programozás nem csak arról szól, hogy kódolok, és akkor ha elég sokat kódolok, akkor készen lesz és jó lesz. Ahogy a kovács szakma sem csak arról szól, hogy ütöm a forró vasat, és akkor jó lesz.
Nagyon sok munkát kell fektetni abba, -- amit már az előző hozzászólásomban meglebegtettem -- hogy jól meg tudd tervezni a kódod, és algoritmus érzék kell hozzá. Ezeket lehet fejleszteni. Ha két részre osztanám a programozói tudást: szintaxis+könyvtárak és tervezés+algoritmus, akkor a tanulásba beleölt idő nagy részét utóbbi kettő fogja kitenni. -- véleményem szerint
[szerk.]
és persze törekedni kell arra, hogy a források után angolul kutatunk, hiszen magyarul csak limitált forrás elérhető, főleg az újabb technológiákból.[ Szerkesztve ]
-
modder
aktív tag
nem akarok trollkodni, de akkor vedd el addig a jogokat, amíg még működik, és akkor kiderül, hogy melyik jog kell neki. meg ellenőrizd, hogy tényleg arra az adatbázisra adtál-e jogokat, amit használni akarsz vele. van ilyen pl., hogy SHOW DATABASES jog, nem árt, ha ki tudod listázni az adatbázisokat, hogy kiválaszthasd a sajátod.
-
modder
aktív tag
válasz Peter Kiss #8892 üzenetére
Ez érdekes. Az első kommentből kiderül, hogy elvileg ezt már javították, ezek szerint semmilyen célt nem szolgált, csak így lett megvalósítva.
Érdekesebb a PHP copy-on-write technikája, amit már olvastam valahol, de később, amikor rá akartam keresni (a pontos kifejezés hiányában) nem találtam semmilyen információt róla. Még arra sem emlékszem, hogy meg lenne-e említve a PHP doksi referenciák fejezetében.
Ez a kitekintés arra volt jó, hogy feliratkoztam a php-internals listára, mert amúgy is érdekel a belső működése
-
modder
aktív tag
válasz Speeedfire #8898 üzenetére
Nem tudom pontosan, mit akarsz (nem olvastam vissza ), de nem hiszem, hogy a $nap-ot a 2. for-cikluson belül akartad deklarálni
-
modder
aktív tag
ezt a kérdést pontosabban is megfogalmazhattad volna, főleg stackoverflow-on
Mit jelent a jó és mit jelent a rossz bemenet?
Egyébként a modelledben a keresés csak akkor fog false-szal visszatérni, ha hiba van az adatbázis lekérdezésben (nem éred el az adatbázist, vagy szintaktikailag helytelen lesz a generált sql)
De ezek csak tippek, számomra nem nyilvánvaló a kérdés
-
modder
aktív tag
válasz Speeedfire #8902 üzenetére
nem ott szeretted volna! Gondolom tisztában vagy vele, hogy amikor a modelledhez hozzáadod a napot, a belső ciklusnak csak az utolsó iterációja fog megjelenni a $nap változóban
-
modder
aktív tag
válasz Speeedfire #8904 üzenetére
akkor gondold át
-
modder
aktív tag
Itt kiraksz egy formot, de magában a formban egy darab azonosítót nem rejtesz el (mondjuk egy hidden inputtal, vagy másképp), így nem tudom, honnan szeded, hogy mondjuk épp az 5-ös azonosítójút szeretném eltárolni a kedvencek közé.
De ebből még mindig nem tudod szerver oldalon, hogy melyik form lett elküldve, melyik azonosítójú elemet akarod betenni favoritba. Az eddigi kódrészletek alapján így néz ki
//pszeudo
for( $row in $rows){
if( $_POST['add'])
$_SESSION['fav_' . $row['id']] = 'true';
}mivel nincsen semmilyen más favorit azonosító, amit elküldesz a formból a szervernek, nem tudom, honnan kéne tudni szerver oldalon, hogy arra az egy bizonyos favorit elemre vonatkozik a hozzáadás
-
modder
aktív tag
Lehet, hogy én vagyok a figyelmetlen, és nem veszek észre valamit a kódban, amiből kiderülhetne az, amire kíváncsi vagyok.
menjünk sorba:index.php:
1) végigiterálsz az adatbázisból szedett favoritokon, mindegyikhez tartozik egy session változó, aminek az értéke true vagy false OK
1.1) kiíratod mindegyik favorithoz, hogy
"<form action='' method='post'>
<input class='fav_false' type='submit' name='add' value=' ' />" . " " . $row['item_name'] . "
</form>
...illetve a del párjátattól függően, hogy a sessionváltozóban true vagy false van-e OK
1.2) mindegyik favoritnál megnézed, hogy $_POST['add'] vagy $_POST['del'] kérés jött-e a fönti formból. NEM OK --> Honnan látod szerver oldalon, hogy az add vagy a del melyik favorit elemre vonatkozik? Hogy jobban megértsd, és nekem is választ tudj adni a kérdésemre, elmondom, hogy szerintem a következőképpen működik az index.php: add vagy del változó megjelenése esetén az összes favorit elemre beállítja a true-t vagy false-t. -
modder
aktív tag
Hála a jó istennek
Annyit kell csinálnod, hgoy a formba teszel egy hidden mezőt aminek a neve pl. fav_id, értéke értelemszerűen a favoritod id-ja.
Amikor pedig megnézed, hogy van-e del vagy add, akkor azt is megvizsgálod a ciklusban, hogy a fav_id megegyezik-e az aktuális iterációban vizsgált favoritoddal.Egyébként nem is értem, hogy ez a hiba nálad miért nem jelentkezett. Gondolom volt egyetlen favoritod, és örültél, hogy arra megy
-
modder
aktív tag
ez számtalan helyen elromolhat. kezdve attól, hogy nem jó a javascript XMLHTTPRequest küldés, nem jó a feldolgozó php (bár ezt kétlem), nem jól nyered ki a requestből az adatot.
Szóval lehetnél specifikusabb, hogy mi nem jó.
Egybként ami feltűnik, hogy relatív útvonalat használsz az XMLHttpRequestben, a HTML fájlod pedig a html mappában van, tehát a request az a hostnev/html/apn.php -ra fog irányulni, első meglátásra.
tegyél az url elé egy per jelet, hogy a hostod gyökerétől mérje az url útvonalát: "/apn.php?blabla"
Azt pedig, hogy hogy kell a problémát megkeresni, hagy ne kelljen elmondani mind chrome-ból vagy firefoxból nyomon tudod követni a javascripted futását, és kiírja a hibákat, érdemes nézni a böngészőből a request-responseokat is, mert ott látod, hogy egyáltalán elment-e a kérés és milyen válasz jött rá
[ Szerkesztve ]
-
modder
aktív tag
válasz Speeedfire #8941 üzenetére
úgy tűnik, yii-t használsz, úgyhogy elég speckó a kérdésed. én azzal még nem foglalkoztam. kéne tudni, hogy működik az new Items nevű modelled.
Ami amúgy egyből feltűnik a fileHandler függvényedben, hogy itt
$model->name = $fullImgName;
$model->size = $instance->size;
$model->type = $type;ugyanarra az objektumra állítod be mindig az értékeket, és utána elmented. Ha ez egy ORM-es cucc, akkor az első mentés után generál egy id-t a PRIMARY KEY-hez, majd ugyanazt a rekordot módosítja újra és újra minden iterációban. (Nem tudom, mi az az $instance, meg ezek, de nem látom, hogy a modellben lenne valami belső léptetés az új elemeknek).
Remélem elég sugallatot adtam
-
modder
aktív tag
válasz Speeedfire #8947 üzenetére
Beállította magának, hogy update lesz? Te lehet, hogy jobban vágod a YII működését, de nem hiszem, hogy intuíció alapján csinál dolgokat
Szerintem ha újat akarsz hozzáadni, minden iterációban példányosíts egy új Items-t.
(Én Kohanával dolgoztam, és ott úgy van az ORM modell, hogy egy példány<-->egy rekord az adatbázisban, persze komplexebb modelleknél, ahol több táblába akarsz egyszerre menteni meg blabla, felül lehet definiálni a működést, de alapból így van)
[ Szerkesztve ]
-
modder
aktív tag
válasz Sk8erPeter #8954 üzenetére
nem beszélve arról, hogy emlékeim szerint le sem fordul így
isset($_POST['hirlevel']) ? $hirlevel = 'igen' : $hirlevel = 'nem';(talán lehet vele trükközni, hogy kapcsos zárójelbe teszed, de lehet, hogy akkor is kell az egyes ágaknak visszatérési érték)
-
modder
aktív tag
válasz Sk8erPeter #8956 üzenetére
ez esetben csak vicceltem!
amúgy én lehet, hogy "picsahülye vagyok az egészhez", de valamelyik programnyelvben akkor is hibát dobott a példakódra (C vagy Java talán vagy mind2)
-
modder
aktív tag
válasz Peter Kiss #8959 üzenetére
jajj
el lehet játszani ilyenekkel, de ugyanehhez a funkcionalitáshoz elég csak egy __call() fv-t használni -
modder
aktív tag
A paginálás nem egyszerű dolog. Gyakorlatilag kell egy olyan osztály, ami képes egy k : [1,n] (ahol k az oldal száma) egész számot leképezni az adatbázis által visszaadott rekordok intervallumaira.
page 1 -> mysql sorok(0,10)
page 2 -> mysql sorok(11, 20)
...Itt a mysql lekérdezésben a LIMIT és az OFFSET-tel szoktak operálni (MySQL-ben), vagy ha az adatbázis interfészed tud ilyen funkcionalitást megvalósító fv-eket, akkor azzal.
kb ez úgy néz ki, hogy ha tudod, hogy 1 oldalon 30 elemet akarsz megjeleníteni, akkor osztályod úgy készíti el az adatbázis lekérdezést az elemeidre, amiket meg akarsz jeleníteni, hogy:
$sql .= ' ORDER BY ido DESC LIMIT 30 OFFSET ' . $page * 30 . ';';
van nagyon sok működő megoldás neten, csak keresgélj.
[ Szerkesztve ]
-
modder
aktív tag
válasz Sk8erPeter #8969 üzenetére
Ó, ezt nem tudtam. Köszönöm a kiegészítést!
-
modder
aktív tag
válasz spammer #8977 üzenetére
szerintem is, kukis az biztos működni fog, és viszonylag egyszerű is, ha csak cikkszámok listájáról van szó. esetleg megnézhetsz valami LocalStorage dolgot (keress rá). ez asszem ilyen HTML5-ös szabvány.
Ha nincs DB, még a cikkszámra kattintva akár egy AJAX-os megoldással (hogy ne töltődjön újra az oldal) session változóba is mentheted a cikkszámokat.
-
modder
aktív tag
szerintem ez, hogy kivételt dobsz, vagy hogy kezeled le azt, ha nem talál a keretrendszered egy oldalt, az rajtad múlik. Általában ugye úgy működik egy mvc architektúrájú keretrendszer, hogy megkeresi az url vagy route alapján ráillő kontrollert.
Lehet az, hogy nincs meg a kontroller vagy nincs meg a kontroller által kiszolgálandó erőforrás, például cikk, termék.
Ha nem találja a kontrollert vagy az adott oldalt, cikket, akármit, amit beírt a felhasználó az url-be, akkor akár helyben is -- ott ahol kiderült, hogy nincsen sehol a kérdéses erőforrás -- küldhetsz az outputra egy 404-et, majd "szép leállást" produkálsz pl. zárod a logokat. Erre csinálhatsz egy függvényt vagy beleraod a response osztályodba, és hívsz egy iylet, hogy $this->response->out_404();
Így meg mindegy, hogy exception-t dobsz-e vagy helyben egy függvényen belül kezeled-e le a dolgokat, mert hiba esetén meghívni egy exception-t vagy egy függvényt ugyanannyi kódolás minden esetben, bár utóbbinál legalább nem operálsz exceptionökkel.
-
modder
aktív tag
válasz Sk8erPeter #8994 üzenetére
Én csak ezzel nem értek egyet:
a kivételkezelés akkor is ezerszer átláthatóbb hibakezelési formaKivételkezelést akkor érdemes használni, amikor egy mély hívássorozat alján keletkezik valahol egy kivételes hiba, és ezt sokkal fentebbi függvényben akarod lekezelni. Ilyen például az adatbázis absztrakciós rétegekben egy mysql hiba, ami, ha jó a kódod, ritkán fordul elő, és általában elég csak annyira foglalkozni vele, hogy loggolod.
Vissza a fenti mondathoz. Ha a kivételkezelést általános programozási gyakorlattá teszed, annak megvan az a hátránya, hogy később, ha ránézel a kódra, nem biztos, hogy fogod tudni, hogy a kivételedet hol dobod (ahogy említetted, amíg ténylegesen nem történt ilyen exception, akkor stacktrace), és amikor refaktorálod a kódot, fogni fogod a fejed.
Még egy dolog.
Ha az osztályodat majd újra fel akarod használni, nem szabad megfeledkezni arról, hogy milyen kivételeket dobhat. Amíg jól van dokumentálva a kódod, addig nem biztos, hogy fejtörést fog okozni, de ha már kevesebb időt töltesz a dokumentálással, valahol újra fel akarod használni a kódodat, szintén fogni fogod a fejed, mert fejlesztés során olyan exceptionöket fog dobálni az osztályod, amire nem számítottál korábban, és újra meg újra le kell őket kezelni. Nem is beszélve arról, hogy az exceptiönök szaporodhatnak, ahogy az osztályod egyre többet tud.Ezt a Dependency Injectionhöz tudom hasonlítani. Ott arról van szó, hogy bizonyos műveleteknek vannak előfeltételei, előfeltétel objektumai, és addig átlátható, amíg a függvények bemenetein megjelennek ezek az előfeltételek, mert addig nyomonkövethető a kdóban az előfeltétel.
Egy szó, mint száz. Nem érdemes általános gyakorlattá tenni a kivételek dobálását. Form validálásnál még talán elmegy. De ezt is lehet hit kérdéssé tenni, nem muszáj rám hallgatni
-
modder
aktív tag
válasz PazsitZ #8996 üzenetére
PHP-ban valszeg nem olyan költséges, mint pl. c++-ban.
Ne értsetek félre, jó dolog az exception olyan hibák kezelésében, amik tényleg az elvárt futástól különböző esetekre vannak.
Ezen kívül azonban, amikor a program funkcionalitásába belekalkulált dolgokról van szó, mint például: S8erPeter-nek volt egy form validálós, feldolgozós példája, ahol hiba esetén kivételt dob, illetve a fentebb tárgyalt esetben, hogy nem talál egy oldalt, akkor exception-t dobjon, amikor az egy belekalkulált működés, szerintem; az exception számomra egy kerülő megoldás, ahol ide-oda ugrálunk a kódban.
Itt tulajdonképpen arról van szó, hogy milyen 'hiba' vagy kivételes eset fordulhat elő többször, amire számítani kell, és mi a valódi hiba (ez utóbbi esetben érdemes kivételt használni). Nem láttam még olyan keretrendszert, ami kivételdobásokra alapozta volna a működését.Nekem ez az álláspontom. Nem éles a határ, hogy mikor érdemes kivételeket használni, nem egyértelmű eldönteni, de én ott például, ahol user input validálást csinálok, számítok rá, hogy rossz lesz az input, és nem fogok kivételeket dobálni rossz inputra.
Egyébként meg mindenki úgy programoz, ahogy akar.
...A dokumentálás meg egyáltalán nem alap, gyors fejlesztési ütemben pedig mindig elmarad, de aki megtanul tiszta kódot írni, az a többi fejlesztő munkáját megkönnyíti.
-
modder
aktív tag
válasz Sk8erPeter #8997 üzenetére
Most már nem fogok mindenre reagálni, leírtam az érveimet. Felőlem mindenki olyan esetekben dobál exception-t a kódjában, ahol akar.
Csak egy pár dolog:
Azt hiszem érthető voltam, de akkor leírom érthetőbben: amikor refaktorálod (átírod, javítod) a kódot, nem fogod tudni, hol dobtad az exceptiönt, amíg tényleg nem dobtál egyet.
Például van a form validáló osztályod, ami dobhat 4féle exception-t, te meg szeretnéd tudni, hol dobja, akkor legjobb esetben is ctrl+ffel keresel rá. Ha pedig a stacktrace-t akarod használni, ahhoz generálnod kell egy olyan hibát, ami ezt az exceptiont dobja.Aztán kiderül, hogy basszus, nem is $functionReturnValue['status'] a megfelelő vizsgálandó visszatérési érték indexe, hanem mondjuk $functionReturnValue['result'].
Nyilván, ha valaki idiótán programoz, arra nincsen mentség.Aki pedig azt állatja, hogy minden függvényt azzal kezd, hogy /** */, az biztos ráér programozni
-
modder
aktív tag
válasz Sk8erPeter #9000 üzenetére
Megadják a lehetőséget
-
modder
aktív tag
válasz Sk8erPeter #9004 üzenetére
én inkább így közelíteném meg:
function blabla(){
// .......
$errorArray = array();
if( $hiba_van ){
$errorArray[] = 'ezért meg azért';
return $errorArray;
}
return empty($errorArray) ? true : $errorArray ;
// .......
}Az exceptiondobálós példával van még egy gubanc: ha minden egyes alkalommal, amikor hibát találsz a validációban, dobsz egy kivételt, akkor ki fogod hagyni az utána következő formelemek validálását, és nem fogod tudni, van-e több hiba is.
Ha pedig minden formelemen végigmész, összegyűjtöd a hibákat, és utána dobsz egy exception-t, benne például egy tömbbel a hibákról, akkor már nem nagyon látom annyira egyszerűbbnek a hibakezelést.
-
modder
aktív tag
válasz Sk8erPeter #9006 üzenetére
A symfony error handlingről beszélt, ami tipikus hiba eset (értsd: ha hiba történik, amire egyáltalán nem számítottál, exception, ugyanez a Kohana is, ezért van stacktrace, amikor valamit elszúrok), nem arról, hogy a mindennapi funkcionalitást exceptionökre építed.
A 404-es hiba exceptionnel történő kezelése pedig nem ördögtől való, mint azt korábban írtam: mindegy. Viszont ez architektúrális szinten jelenik meg, ezért van létjogosultsága.
Mondtam, nehéz eldönteni mi az amit lehet/szabad/érdemes exceptionokkel csinálni és mi az, amit nem. A validálás olyan, amit én nem exceptiönökkel csinálnék. Alternatívát a 404-re pedig írtam.
-
modder
aktív tag
válasz Sk8erPeter #9009 üzenetére
Nem akartam amellett kardoskodni, hogy kb soha nem szabad Exceptionöket használni, csak nem érdemes első megoldásként gondolni rá. Mindig nagyban függ a problémától, lehet, hogy nagyobb cégeknél, pl. IBM erről vannak infók. Én úgy érzem, hogy nem szívesen fordulok Exceptionökhöz, mégha kényelmesnek is tűnik a használata.
Erről lehetne akár cikket is írni, hogy hogyan lehet bizonyos eseteket simán return valuekkal vagy exceptionokkel megoldani, és összehasonlítani.
Két nagy probéma van az exceptionökkel:
C++-ban azért okoz teljesítméncsökkenést, mert az Exception-t a stacken hozza létre, és dobásnál ahogy visszatér az összes függvényből, mindig a stack tetejére kell másolnia az exception objektumot, ha a catch 5 fv-nyel föntebb van, akkor az 5 másolás.
A másik probléma pedig hogy ha például nyitunk egy resource-t pl file handlert, de dobunk egy exception-t, akkor hajlamosak vagyunk erről megfeledkezni, és nyitva marad.
Az előbbi szerintem PHP-ra már nem igaz, mert amúgy minden adatstruktúrának megvan a C-beli reprezentációja (plusz absztrakció), egyébként pedig valszeg minden heap-en van tárolva.
utóbbi pedig akár lehet igaz is. -
modder
aktív tag
válasz Speeedfire #9015 üzenetére
name és value attributumát megkapod php-ban
-
modder
aktív tag
válasz PazsitZ #9017 üzenetére
Ha látnátok a fától az erdőt, akkor észrevennétek, hogy Sk8erPeter teljesítménybeli kérdésére próbáltam választ adni az utolsó bekezdésben, csak ehhez elő kellett venni a régi nyelv alap problémáit a kivételekkel, hogy össze lehessen hasonlítani.
De igazad van, vagy várjál csak, ja nincs! -
modder
aktív tag
Sziasztok!
Az lenne a kérdésem, hogy miért nem működik, pedig már próbáltam mindent