00php.qxd
7/23/2004
7:48 PM
Page xxi
Elõszó Nemrég lapozgattam William Gibson könyveit és az All Tomorrow’s Parties címû kötetben erre bukkantam: Ami túltervezett vagy túl egyedi, annak eredménye mindig elõre látható, és ez az elõre láthatóság, ha nem is bukással, de az elegancia hiányával jár. Gibson elegánsan foglalja össze, miért bukik meg sok rendszer. A színes négyszögek táblára rajzolásával nincs semmi baj, de eme ragaszkodásunk a bonyolulthoz hatalmas hátrányt jelent. Amikor megtervezünk valamit, arra van szükség, hogy az adott problémára adjunk megoldást. Nem szabad elõre tekintenünk, hogy a probléma vajon mi lesz évekkel késõbb, egy nagyméretû, összetett felépítményben, amikor pedig egy általános célú eszközt építünk, nem szabad túlzott konkrétsággal megkötnünk a felhasználó kezét. A PHP maga is e kettõ – a webes feladatok megoldásának konkrétsága, illetve egy bizonyos, a felhasználók kezét megkötõ megoldás megadására való hajlam – között egyensúlyoz. Kevesen mondanák a PHP-re, hogy elegáns. Parancsnyelvként számos, a Világháló csataterein többéves szolgálat közben szerzett sebet hordoz. Ami elegáns benne, az a megközelítés egyszerûsége. Minden fejlesztõ idõrõl idõre váltogatja, milyen megközelítést alkalmaz egy-egy feladat megoldására. Kezdetben az egyszerû megoldásokat részesítik elõnyben, mert nem elég tapasztaltak ahhoz, hogy a bonyolultabb elveket megértsék. Ahogy tudásuk gyarapszik, az alkalmazott megoldások egyre bonyolultabbak lesznek, és a megoldható feladatok nagysága is fokozatosan nõ. Ekkor fenyeget annak a veszélye, hogy az összetettség rutinná válik és csapdába ejt. Elegendõ idõ és erõforrás birtokában minden feladat megoldható szinte bármilyen eszközzel. Az eszköz csupán arra való, hogy ne legyen útban. A PHP éppen erre törekszik. Nem kényszerít ránk semmilyen programozási megközelítést, és igyekszik a lehetõ legkisebbre csökkenteni a közénk és a megoldandó probléma közé beékelõdõ rétegek számát.
00php.qxd
xxii
7/23/2004
7:48 PM
Page xxii
PHP fejlesztés felsõfokon Ez azt jelenti, hogy a PHP-ben minden adott, hogy megtaláljuk a legegyszerûbb és legelegánsabb megoldást, és ne kelljen elvesznünk a rétegek és felületek nyolc elõadóterem tábláit elfoglaló tengerében. Természetesen az, hogy minden eszközt megkapunk, amivel elkerülhetjük egy szörnyeteg építését, nem garantálja, hogy így is lesz. De szerencsére itt van nekünk George és ez a könyv. George olyan utazásra hív minket, ami saját útjára hasonlít, nem csupán a PHPvel, hanem a programfejlesztéssel és problémamegoldással kapcsolatban általában. Pár napnyi olvasás után elsajátíthatjuk mindazt a tudást, amit õ a területen évek munkájával szerzett meg. Nem rossz üzlet, úgyhogy nem is érdemes e haszontalan elõszóval vesztegetni az idõt – irány az elsõ fejezet és az utazás! Rasmus Lerdorf
00php.qxd
7/23/2004
7:48 PM
Page xxiii
A szerzõrõl George Schlossnagle igazgatóként dolgozik az OmniTI Computer Consulting nevû marylandi cégnél, amelynek szakterületét a nagyméretû webes és elektronikus levelezési rendszerek jelentik. Mielõtt az OmniTI-hez került volna, technikai vezetõje volt számos magasszintû közösségi webhelynek, ahol tapasztalatokat szerzett a PHP igen nagy vállalati környezetekben történõ alkalmazásával kapcsolatban. Állandó résztvevõje a PHP közösség munkájának, hozzájárult többek között a PHP mag, illetve a PEAR és PECL bõvítménytárak fejlesztéséhez. Mielõtt az információ-technológia területére lépett volna, George matematikusnak készült, és két évig szolgált a Békehadtestben, mint tanár. Tapasztalatai megtanították arra, hogy a problémamegoldásban értékelje az interdiszciplináris megközelítést, ami a bajok gyökeréig hatol, nem csupán a tüneteket kezeli.
Köszönetnyilvánítás A könyv írása során rengeteget tanultam, és ezt mindenkinek meg szeretném köszönni, aki segítette munkámat. A PHP valamennyi fejlesztõjének köszönöm, hogy kemény munkával ilyen nagyszerû terméket állítottak elõ. Állandó erõfeszítéseik nélkül e kötetnek nem lett volna témája. Shelley Johnston, Damon Jordan, Sheila Schroeder, Kitty Jarrett, és a Sams kiadó többi munkatársa: köszönöm, hogy bizalmat szavaztak nekem és könyvemnek. Nélkülük ez csak egy meg nem valósult ábránd lenne. Mûszaki szerkesztõim, Brian France, Zak Greant és Sterling Hughes: köszönöm a fejezetvázlatok elolvasására és megjegyzésekkel ellátására szánt idõt és energiát, ami nélkül – biztos vagyok benne – a könyv befejezetlen maradt volna, és tele lenne hibával. Testvéremnek, Theo-nak: köszönöm a folyamatos szakmai kritikát és ösztönzést, valamint azt, hogy átvetted a munkámat, amikor a könyv befejezésén dolgoztam.
00php.qxd
xxiv
7/23/2004
7:48 PM
Page xxiv
PHP fejlesztés felsõfokon Szüleimnek: köszönöm, hogy azzá neveltetek, aki ma vagyok, és különösen hálás vagyok anyámnak, Sherrynek, aki nagylelkûen végigolvasta a könyv valamennyi fejezetét. Remélem, büszkék lehettek rám. És aki a legfontosabb, feleségem, Pei: köszönöm, hogy megingathatatlanul mellettem álltál és egy éven át önzetlenül feláldoztad az éjszakákat és hétvégéket, hogy dolgozhassam a könyvön. Örökké hálás leszek a szeretetért, türelemért és támogatásért.
00php.qxd
7/23/2004
7:48 PM
Page xxv
Bevezetés Ez a könyv arra törekszik, hogy az Olvasóból szakértõ PHP programozót faragjon. Szakértõ programozónak lenni nem csupán annyit jelent, hogy tökéletesen ismerjük a nyelvtant és a nyelv szolgáltatásait (bár ez kétségkívül segít), hanem azt is, hogy képesek vagyunk hatékonyan használni feladatok megoldására. A könyv elolvasása után tisztában leszünk a PHP erõsségeivel és gyengéivel, valamint a webes és más feladatok megoldásának legjobb módszereivel. A kötet az elveket tartja szem elõtt, így általános problémákat ír le, és ezekre ad egy-egy konkrét példát, szemben a „szakácskönyv” szemléletû könyvekkel, amelyekben mind a problémák, mind a megoldások egyediek. Ahogy az angol mondás tartja: „Adj egy halat, és egy napig van mit ennem – taníts meg halászni, és soha többé nem éhezem.” A kötet célja, hogy megtanítsa az eszközök használatát, amelyekkel bármilyen feladatot megoldhatunk, és hogy megtanítsa kiválasztani a megfelelõ eszközt. Véleményünk szerint a legkönnyebb példákon keresztül tanulni, ezért a könyvben rengeteg gyakorlati példa szerepel, amelyek bemutatják a tárgyalt fogalmakat. A valós környezettel nem rendelkezõ elméleti példák nem sokat érnek, így a könyvben csak valódi feladatok elvégzésére alkalmas, „igazi” kódokat találunk. Nem használtunk olyan osztályneveket, mint az angol nyelvû példákban gyakori Foo és Bar; ahol csak lehetséges volt, igyekeztünk létezõ nyílt forrású programokból venni a példákat, hogy igazi megvalósításokat lássunk.
00php.qxd
xxvi
7/23/2004
7:48 PM
Page xxvi
PHP fejlesztés felsõfokon
A PHP az üzleti életben Amikor 1999-ben elkezdtem hivatásszerûen foglalkozni a PHP programozással, a nyelv éppen csak kezdett több lenni egy újabb, amatõrök által használt parancsnyelvnél. Akkor adták ki a PHP 4-et az elsõ Zend motorral, ami gyorsabbá és stabilabbá tette a nyelvet. A PHP-t használók száma ugrásszerûen növekedni kezdett, de a nagy, üzleti célú webhelyek számára még mindig nehéz volt eladni. A nehézség leginkább két forrásból eredt: • A Perl, ColdFusion és más parancsnyelveken fejlesztõk nem frissítették ismereteiket a PHP fejlõdésével, így nem voltak tisztában az új képességekkel. • A Java nyelven fejlesztõk nagy és teljes keretrendszereket, erõteljes objektumközpontú támogatást, statikus típusokat és más, „üzleti” képességeket kívántak. Mára egyik sem jelent akadályt. A PHP többé nem ragasztónyelv, amit lelkes amatõrök használnak, hanem erõteljes parancsnyelv, amelyet felépítése ideálissá tesz a webes feladatok megoldására. Egy programozási nyelv hat követelménynek kell, hogy eleget tegyen, hogy üzleti célú alkalmazásokban is használhatóvá váljon: • • • • • •
Gyors prototípus-készítés és megvalósítás A modern programozási megközelítések (paradigmák) támogatása Méretezhetõség (Kiváló) teljesítmény Együttmûködési képesség Bõvíthetõség
Az elsõ követelmény – a gyors prototípus-készítési lehetõség – születése óta erõssége a PHP-nek. A webes fejlesztések és a celofánba csomagolt szoftvertermékek közötti egyik lényeges különbség, hogy a Weben egy termék „leszállításának” szinte semmilyen költsége nincs. A csomagolt termékek esetében azonban egy aprócska hiba is azt jelentheti, hogy ezernyi CD-t írattunk tele hibás kóddal, és ezt csak úgy javíthatjuk ki, ha értesítjük valamennyi érintett vásárlót a hibajavítás létezésérõl, és rávesszük õket, hogy töltsék le és telepítsék. A webes hibajavításoknál elég, ha a felhasználó legközelebb újra betölti az oldalt, ezért a webalkalmazások rugalmasan és gyakran frissíthetõk. A parancsnyelvek általában is kitûnõek rugalmas programok fejlesztésére, mert lehetõvé teszik, hogy anélkül fejlesszünk gyorsan és próbáljunk ki új ötleteket, hogy ismételten végig kellene járnunk a fordítás–összeszerkesztés–tesztelés–hibakeresés procedúráját. A PHP különösen jó az ilyesmire, mert nagyon gyorsan tanulható, így új fejlesztõket minimális tapasztalattal is bevonhatunk.
00php.qxd
7/23/2004
7:48 PM
Page xxvii
PHP fejlesztés felsõfokon A PHP 5 a többi követelménynek is maradéktalanul megfelel. Amint a könyvben látni fogjuk, a PHP új objektummodellje erõteljes és a szabványoknak megfelelõ objektumközpontú támogatást nyújt. A PHP fürge és méretezhetõ, köszönhetõen az alkalmazható programozási stratégiáknak, illetve annak, hogy az üzleti logika létfontosságú részeit könnyû újra megvalósítani valamilyen alacsonyszintû nyelven. A nyelv emellett tengernyi bõvítményt biztosít a más szolgáltatásokkal való együttmûködésre, az adatbázis-kiszolgálóktól a SOAP-ig. Végül, a PHP megfelel a programozási nyelvek legfontosabb követelményének: egyszerûen bõvíthetõ. Ha a nyelv nem rendelkezne a számunkra szükséges szolgáltatással vagy képességgel, mi magunk is hozzáadhatjuk.
A könyv felépítése A kötet öt, többé-kevésbé önálló részre oszlik. Bár úgy szerkesztettük meg, hogy az érdeklõdõ könnyen elõreugorhasson egy adott fejezethez, a könyvet javasolt elejétõl a végéig elolvasni, mert számos példát fokozatosan építünk fel. A könyv szerkezete a tanulás természetes folyamatához igazodik. Elõször azt tárgyaljuk, hogyan kell helyes PHP kódot írni, majd rátérünk az egyes módszerekre, azután a teljesítmény fokozására, végül a nyelv bõvítésére. A felépítés azon alapul, hogy hisszük, egy profi programozó legfontosabb felelõssége, hogy „karbantartható” kódot írjon, és hogy könnyebb egy jól megírt kódot gyors futásúvá tenni, mint egy gyors, de silány kódot feljavítani.
I. rész Megvalósítási és fejlesztési módszerek 1. fejezet (Kódolási stílusok) Az elsõ fejezet a kötetben használt kódolási szokásokat mutatja be, és ezek köré egy kódolási stílust épít, valamint rávilágít a következetes, jól dokumentált kód fontosságára. 2. fejezet (Objektumközpontú programozás tervezési minták segítségével) A második fejezet a PHP 5 objektumközpontú (objektum-orientált, OOP) programozást támogató szolgáltatásait részletezi, és az ilyen irányú képességeket általános tervezési minták környezetében mutatja be. Azzal, hogy teljes áttekintést nyújt mind a PHP 5-ben megjelent új OOP szolgáltatásokról, mind az OOP megközelítés mögött megbúvó elvekrõl, a fejezet hasznos lehet az OOP programozással ismerkedõk és a tapasztalt programozók számára is. 3. fejezet (Hibakezelés) Hibázni emberi dolog. A harmadik fejezet a PHP eljárásközpontú (procedurális) és OOP hibakezelõ eljárásait tárgyalja, különös tekintettel a PHP 5 új, kivétel alapú hibakezelési képességeire.
xxvii
00php.qxd
xxviii
7/23/2004
7:48 PM
Page xxviii
PHP fejlesztés felsõfokon 4. fejezet (Megvalósítás PHP nyelven: a sablonok és a Világháló) A negyedik fejezet a sablonrendszereket tekinti át, vagyis az olyan elemkészleteket, amelyek a megjelenítés és a programkód kettéválasztását segítik. A fejezet összehasonlítja a teljes és az ad hoc jellegû sablonrendszerek elõnyeit és hátrányait, az elõbbire példaként a Smarty-t használva. 5. fejezet (Megvalósítás PHP nyelven: önálló programok) Manapság csak igen kevés webalkalmazásnak nincs szüksége háttérösszetevõre. Az arra való képesség, hogy már létezõ PHP kód újrahasznosításával írjunk kötegelt feladatokat, héjprogramokat és nem webes feldolgozó rutinokat, létfontosságú a nyelv üzleti környezetben való hasznosításában. Az ötödik fejezet az önálló programok és démonok írásának alapjait taglalja. 6. fejezet (Egységtesztelés) Az egységtesztelés annak egyik módszere, hogy ellenõrizzük, a kód megfelel-e arra a célra, amire létrehoztuk. A hatodik fejezetben megvizsgáljuk az egységtesztelési módszereket, és azt, hogy a PHPUnit segítségével hogyan készíthetünk rugalmas egységtesztelõ csomagokat. 7. fejezet (A fejlesztõkörnyezet kezelése) A kód összehangolása a legtöbb fejlesztõ számára nem a legizgalmasabb feladat, mindazonáltal igen fontos. A hetedik fejezet bemutatja, hogyan tarthatjuk kézben a kódot a nagy projektekben, és átfogó bevezetést nyújt a CVS (Concurrent Versioning System, változatkövetõ rendszer) használatába. 8. fejezet (Hogyan tervezzünk jó API-t?) A nyolcadik fejezet útmutatást ad egy olyan kódtár létrehozásához, ami kezelhetõ, rugalmas és könnyen felhasználható különbözõ munkák során.
II. rész Gyorstárak 9. fejezet (Teljesítményfokozás külsõ módszerekkel) A gyorstárak használata valószínûleg a teljesítmény fokozásának, illetve az alkalmazás méretezésének leghatékonyabb módja. A kilencedik fejezet a PHP-n kívüli tárolási módszereket vizsgálja, és a fordítói és helyettes (proxy) gyorstárakat tárgyalja. 10. fejezet (Adatösszetevõk átmeneti tárolása) A tizedik fejezet arra összpontosít, hogyan építhetünk tárolási módszereket magába a PHP kódba, illetve hogyan és mikor alkalmazzunk gyorstárakat egy alkalmazásban. Sor kerül egy mûködõképes tárolórendszer kifejlesztésére is, ami több háttértárat használ.
00php.qxd
7/23/2004
7:48 PM
Page xxix
PHP fejlesztés felsõfokon 11. fejezet (Számítási újrahasznosítás) A tizenegyedik fejezetben megnézzük, hogyan tehetjük az egyes algoritmusokat és folyamatokat hatékonyabbá a köztes adatok átmeneti tárolásával. Lefektetjük a számítási újrahasznosítás alapelveit, és azokat gyakorlati példákkal illusztráljuk.
III. rész Elosztott alkalmazások 12. fejezet (Adatbázisok használata) Az adatbázisok szinte minden dinamikus webhelyen központi szerepet töltenek be. A tizenkettedik fejezet a PHP és az adatbázis-rendszerek közötti híd építésének hatékony módszereit mutatja be. 13. fejezet (A felhasználók hitelesítése és a munkamenetek biztonsága) A tizenharmadik fejezet a felhasználók azonosításának kezelését, és az ügyfél–kiszolgáló kapcsolatok biztonságát veszi górcsõ alá. Többek között tárgyaljuk a titkosított munkameneti információk „sütikben” (cookie) való tárolását, és teljes egészében megvalósítunk egy egyszerû bejelentkezési rendszert is. 14. fejezet (Munkamenetek kezelése) A tizennegyedik fejezet a PHP munkameneti bõvítésének ismertetésével, illetve saját munkamenet-kezelõk írásával folytatja a felhasználói munkamenetek tárgyalását. 15. fejezet (Elosztott környezet kiépítése) A tizenötödik fejezet olyan méretezhetõ alkalmazások építését mutatja be, amelyek egyetlen gépnél többet igényelnek. Részletezzük a számítógépfürtök összeállítását és hatékony kezelését, valamint azt, hogy hogyan kezelhetjük hatékonyan az átmeneti tároló és adatbázisrendszereket. 16. fejezet (RPC: együttmûködés távoli szolgáltatásokkal) Az egyszerû webes gép–gép kommunikációt lehetõvé tevõ szolgáltatások kulcsszava manapság a webszolgáltatás. Ebben a fejezetben a két legelterjedtebb webszolgáltatási protokollt nézzük meg, az XML-RPC-t és a SOAP-ot.
IV. rész Teljesítmény 17. fejezet (Teljesítménymérés: teljes alkalmazások tesztelése) Az alkalmazás teljesítményének mérése szükséges ahhoz, hogy meggyõzõdhessünk róla, elbírja azt a forgalmat, amelynek feldolgozására szánták, és hogy azonosíthassuk azokat az összetevõket, amelyek szûk keresztmetszetet jelenthetnek. A tizenhetedik fejezetben áttekintjük a különbözõ alkalmazásmérõ (benchmark) programcsomagokat, amelyekkel egy alkalmazás teljesítménye és stabilitása megmérhetõ.
xxix
00php.qxd
xxx
7/23/2004
7:48 PM
Page xxx
PHP fejlesztés felsõfokon 18. fejezet (Profilkészítés) Miután azonosítottuk a fontosabb lehetséges szûk keresztmetszeteket egy alkalmazásban, profilkészítõ eszközökkel elkülöníthetjük a problémás részeket a kódban. A tizennyolcadik fejezet a profilkészítés célját és módszereit ismerteti, majd megtanít az APD (Advanced PHP Debugger) használatára, amellyel megvizsgálhatjuk a kódot. 19. fejezet (Szintetikus mérés: kódblokkok és függvények értékelése) Két kódrészletet lehetetlen összehasonlítani, ha különbségeik mennyiségi mérésére nincs mód. A tizenkilencedik fejezet áttekinti a teljesítménymérési módszereket, illetve az egyedi mérõprogramok megvalósítását és értékelését.
V. rész Bõvíthetõség 20. fejezet (A PHP és a Zend Engine titkai) Ha tudjuk, hogyan mûködik a PHP „a színfalak mögött”, okosabb tervezési döntéseket hozhatunk, kihasználva a PHP erõsségeit és megkerülve gyengéit. A huszadik fejezet a PHP belsõ mûködésének technikai részleteit tartalmazza, illetve azt, hogy hogyan kommunikálnak a webkiszolgálókhoz hasonló alkalmazások a PHP-vel, hogyan készít az értelmezõ a parancsfájlokból köztes kódot, és hogyan zajlik a program végrehajtása a Zend motorban. 21. fejezet (A PHP bõvítése: I. rész) A huszonegyedik fejezet a C nyelvû PHP bõvítmények írásába vezet be. Foglalkozik a meglevõ PHP kódok C nyelvre való átültetésével, illetve azzal is, hogyan írhatunk olyan bõvítményeket, amelyek lehetõvé teszik, hogy a PHP hozzáférjen a mások által készített C könyvtárakhoz. 22. fejezet (A PHP bõvítése: II. rész) A huszonkettedik fejezet az elõzõ témáját folytatja magasabb szinten; olyan témakörökkel, mint az osztályok létrehozása a bõvítmények kódjában, illetve az adatfolyamok és a munkamenet-kezelési képességek használata. 23. fejezet (SAPI-k készítése és a Zend Engine bõvítése) A huszonharmadik fejezet a PHP alkalmazásokba ágyazásával foglalkozik, illetve a Zend Engine bõvítésével, amelynek révén megváltoztathatjuk a nyelv alapviselkedését.
00php.qxd
7/23/2004
7:48 PM
Page xxxi
PHP fejlesztés felsõfokon
Felületek és változatok A kötet a PHP 5-re épül, de az anyag mintegy tíz százalékának kivételével nem kifejezetten csak a PHP 5-re vonatkozik. (Az említett tíz százalékba a 2. és 22. fejezetekben bemutatott új, objektumközpontú szolgáltatások, illetve a 16. fejezetben a SOAP tárgyalása tartozik.) Elveket és módszereket mutatunk be, hogy kódunk gyorsabb, okosabb és jobban tervezett legyen. Reményeink szerint legalább a könyv fele hasznosnak bizonyul abban, hogy bármilyen nyelven jobb kódot írjunk. Minden programot, ami a kötetben szerepel, Linuxon írtunk és teszteltünk, de módosítás nélkül futniuk kell Solaris, OS X, FreeBSD vagy bármely más Unix-klón rendszeren is. A programok legtöbbje minimális módosítással Windowson is futtatható, bár egyes segédeszközök (mégpedig az 5. fejezetben bemutatandó pcntl függvények) esetleg nem ültethetõk át teljesen.
xxxi