E N C Y K L O P E D I E
W E B D E S I G N E R A
PHP
moduly rozšíření akcelerátory
• Moduly a doplňky pro zvýšení • • • • • • •
funkcionality, zjednodušení a zefektivnění programování v PHP verze 4 a 5. Využití Pear DB a ADODB pro přístupy ke zdrojům dat. Generování HTML s balíky Smarty a HTML_QuickForm. XML_Parser a SimpleXML pro tvorbu a parsování XML dokumentů. Flexibilní řízení přístupu uživatelů k serveru využitím modulů Auth a Auth_HTTP. Vyspělé schopnosti elektronické pošty pomocí Mail a Mail_mime. Možnosti pokročilého ladění, diagnostiky a zvyšování výkonu skriptů. Množství praktického kódu použitelného ihned v aplikacích.
www.zonerpress.cz
© Foto: Jiří Heller
David Sklar
PHP 5 moduly, rozšíření a akcelerátory
PHP 5 moduly, rozšíření a akcelerátory
David Sklar
Essential PHP Tools: Modules, Extensions, and Accelerators by David Sklar. Original English language published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 9 47 10 USA. Copyright © 2004 by Apress L.P. CZECH language edition copyright © 2005 by ZONER software s.r.o. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from publisher. Originál v anglickém jazyce vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 9 47 10 USA. Copyright © 2004 Apress L.P. České vydání Copyright © 2005 ZONER software s.r.o. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení vydavatele.
PHP 5 – moduly, rozšíření a akcelerátory Autor: David Sklar Copyright © ZONER software s.r.o. Vydání první v roce 2005. Všechna práva vyhrazena. Katalogové íslo: ZR424 Zoner Press ZONER software s.r.o. Koželužská 7, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera © Cover foto: Jiří Heller, HELLER.CZ s.r.o., www.heller.cz © Cover a layout: Ing. Pavel Kristián Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí.
Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software s.r.o. Koželužská 7, 602 00 Brno tel.: 532 190 883, fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz
ISBN 80-86815-19-6
Stručný obsah Část I
Databáze
21
Kapitola 1
Přístup k databázím s DB
23
Kapitola 2
Přístup k databázím s ADODB
43
Část II
HTML
71
Kapitola 3
Zpracování formulářů s HTML_QuickForm
Kapitola 4
Šablony se Smarty
73
Část III
XML
Kapitola 5
Rozklad XML založený na událostech s XML_Parser
159
Kapitola 6
Vývoj webových služeb s XML_RPC
179
Kapitola 7
Vývoj webových služeb se SOAP
193
Kapitola 8
Snazší parsování XML se SimpleXML
219
Část IV
Networking
107
157
227
Kapitola 9
Odesílání pošty
229
Kapitola 10
Autentizace, uživatelé a hesla
245
Část V
Ladění, cache a optimalizace
Kapitola 11
Pohledy pod kapotu PHP
267
Kapitola 12
Profilování a ladění s Xdebug
277
Kapitola 13
Akcelerace s code cache
297
265
Podrobný obsah Informace o autorovi Poděkování Úvod Pošlete nám váš názor Stažení zdrojového kódu Informace o PEAR
Část I
Databáze
Kapitola 1
Přístup k databázím s DB
Prozkoumání jednoduchého databázového příkladu Úvod do DSN Odesílání dotazů a získávání výsledků Přeznačení speciálních znaků v řetězci a zástupné symboly Použití jednotlivých metod pro získávání dat Informace o dotazu Opakované spouštění dotazu Představení posloupností Úvod do zpracování chyb Kapitola 2
Přístup k databázím s ADODB
Připojení a prosté dotazy Úvod do sad záznamů Zpracování chyb Úvod do posloupností Generování HTML Ukládání výsledků dotazů do cache Export dat
Část II
HTML
Kapitola 3
Zpracování formulářů s HTML_QuickForm
Vytvoření a zobrazení formuláře Zpracování odeslaných dat Nastavení ověřovacích pravidel
11 11 13 15 15 16
21 23 23 24 25 29 33 36 37 39 40 43 43 46 52 54 55 67 68
71 73 73 93 97
Kapitola 4
Šablony se Smarty
Instalace a konfigurace Smarty Základní pojmy Smarty Implementace podmínkové logiky Zobrazování dat prostřednictvím cyklů Vkládání souborů a šablon Zpracování textu Ukládání výstupu šablony do cache Kompletní příklad
Část III XML Kapitola 5
Rozklad XML založený na událostech s XML_Parser
Zpracování značek a znakových dat Zpracovatelské instrukce Zpracování vnořených značek Práce ve stylu prvek za prvkem Specifikace znakových sad Poznámky Kapitola 6
Vývoj webových služeb s XML_RPC
Volba XML-RPC Volání procedur XML-RPC na jiném serveru Obsluhování metod XML-RPC Poznámky Kapitola 7
Vývoj webových služeb se SOAP
Volba SOAP Instalace SOAP Kladení požadavků SOAP Obsluhování požadavků SOAP Jak dál Poznámky Kapitola 8
Snazší parsování XML se SimpleXML
Vytváření objektů SimpleXML Práce s objekty SimpleXML Práce se jmennými prostory Prohledávání s XPath
107 108 110 122 124 135 139 150 153
157 159 160 168 170 173 175 177 179 179 185 187 192 193 193 194 194 204 217 217 219 219 221 223 225
Část IV Networking Kapitola 9
Odesílání pošty
Odesílání textových e-mailů s modulem Mail PEAR Odesílání zpráv Mail MIME s Mail_mime Poznámky Kapitola 10 Autentizace, uživatelé a hesla Práce s modulem Auth Auth_HTTP Poznámky
Část V
Ladění, cache a optimalizace
Kapitola 11 Pohledy pod kapotu PHP Od zdrojového souboru k výstupu Jak funguje code cache Jak funguje odlaďovač Některé rozdíly mezi vnitřnostmi PHP 4 a PHP 5 Poznámky Kapitola 12 Profilování a ladění s Xdebug Instalace Xdebug Funkce pro sledování Profily funkcí Vzdálené ladění Poznámky
227 229 229 233 243 245 245 262 263
265 267 268 273 274 275 276 277 277 278 285 287 296
Kapitola 13 Akcelerace s code cache
297
Práce s APC: alternativa k cache PHP Práce s akcelerátorem PHP ionCube Práce s Turck MMCache Srovnávací testy výkonnosti cache Poznámky
298 306 316 326 328
11
Informace o autorovi David Sklar je nezávislý konzultant v oblastech vývoje softwaru a strategické technologie. Je spoluzakladatelem Student.com a TVGrid.com a působil v nich na pozici Chief Technology Officer. V obou firmách David dohlížel na vývoj rozličných systémů, které doručují personalizovaný dynamický obsah uživatelům po celém světě. Poté, co došel v roce 1996 k názoru, že pokud jde o web, je PHP pro jeho programovací potřeby to pravé řešení, vytvořil PX (http://px.sklar.com/), který umožňuje uživatelům PHP vyměňovat si programy. Od té doby se David při svých osobních i profesionálních projektech stále spoléhá na PHP Je také spoluautorem "kuchařky" PHP (PHP Cookbook, vydavatelství O’Reilly, 2002). Když David nesedí u počítače, pojídá koláčky donuts, poslouchá hudbu, a taky rád vaří. Je představitelem The Transparency Project, což je nezisková organizace, která koordinuje standardy značek pro data, a buduje nástroje, které analyzují veřejně dostupné informace o financování politických kampaní. David žije v New York City a vystudoval obor Computer Science na Yaleské univerzitě.
Poděkování Nejvýznačnější a nesmírné díky patří autorům softwaru, o němž kniha pojednává. Těmito autory jsou: Dietrich Ayala, Stig Bakken, Marcus Boerger, Shane Caraveo, Daniel Cowgill, Tomas V.V. Cox, Adam Daniel, Edd Dumbill, James E. Flemer, Chuck Hagenbuch, Richard Heyes, Sterling Hughes, Martin Jansen, Dan Libby, John Lim, Arnaud Limbourg, Nick Lindridge, Bertrand Mansion, Monte Ohrt, Jon Parise, Derick Rethans, Rob Richards, George Schlossnagle, Yavor Shahpasov, Dmitry Stogov, Andrei Zmievski a mnoho dalších přispěvatelů. Díky patří také četným kodérům, architektům, lidem, kteří opravovali chyby v kódu, a ostatním lidem podílejícím se na správě softwaru, kteří všichni dohromady přispěli k tomu, že je dnes PHP tak mocný, i tak populární jazyk. Aby se vydání knihy uskutečnilo, na tom tvrdě pracovalo mnoho lidí z vydavatelství Apress: Martin Streicher (který přišel s nápadem vydat knihu s tímto obsahem), Kylie Johnsonová (která poháněla práce kupředu), Kim Wimpsettová (její korektury vychytaly spoustu chyb), a Doris Wongová (která se postarala o to, aby kniha byla taková, že si ji budou lidé chtít koupit). Kdyby tu nebyla Valerie Perryová, neměla by kniha žádný rejstřík. Obálku vyrobil Kurt Krames. Dík chci také vyjádřit Christine Calderwoodové a Johnu Fergusonovi. Velice oceňuji názory, připomínky, disciplínu a profesionalitu všech, kdo se na knize podíleli. K dokončení knihy kromě toho podstatně přispělo i mnoho lidí, kteří nepracují ve vydavatelství Apress: Stewart Ugelow a Max Goldberg poskytli serverové prostředky, takže jsem mohl software otestovat a připravit pro různá prostředí. Celou knihu pečlivě prošel Adam Trachtenberg, jednotlivé kapitoly prohlédli Bertrand Mansion a George Schlossnagle. A ve zcela samostatné kategorii patří mé díky Susannah, za to, že mi dodávala odvahu a povzbudivě na mě mrkala.
13
Úvod Tento úvod obsahuje informace o tom, komu je kniha určena, co se v ní probírá, a poskytuje něco základních informací o údržbové utilitě, s jejíž pomocí nainstalujete mnohé z doplňků, které se probírají v knize.
Komu je kniha určena Přestože je spousta funkcionality zabudovaná přímo v PHP, mnohé běžné úlohy webového programování se řeší snadněji pomocí modulů doplňků a dodatečných balíků. Poohlížíte-li se po možnostech, jak snadněji řešit následující druhy úloh, je kniha pro vás jako dělaná:
• • • • • • • • •
Přistupovat k nějaké databázi. Generovat robustní webové formuláře. Využívat pro stránky nějaký systém šablon. Vytvářet nebo rozkládat dokumenty XML. Klást požadavky metodami XML-RPC či SOAP, nebo je obsluhovat. Odesílat HTML nebo zprávy elektronické pošty skládající se z několika částí. Ověřovat totožnost uživatelů (autentizace). Prozkoumávat své skripty pomocí nějakého odlaďovače. Zvyšovat výkon serveru, aniž by se musel přepisovat kód.
V knize se předpokládá, že máte základní znalosti programování v jazyku PHP: víte, jak se vkládají soubory, píší vlastní funkce, vytvářejí objekty, i jak se prohledávají $_REQUEST, $_GET, či $_POST, když chcete najít data odeslaná z formuláře. Ovšem, abyste mohli těžit z tipů a z vysvětlujících statí knihy, nemusíte rozhodně být zdatným programátorem PHP. V každé kapitole se probírá v úplnosti a podrobně, jak se nainstalují jeden či dva potřebné moduly, a jak se s nimi pracuje. Každá kapitola také obsahuje celou řadu konkrétních příkladů. Takže, jestliže jste doposud ještě nic neslyšeli o žádném z balíků, které se v knize probírají, je kniha pro vás jako ušitá. Kniha předkládá spoustu vysoce kvalitního kódu PHP, kterým můžete, zdarma, vylepšovat své vlastní programy.
Jakou má kniha strukturu Kniha se skládá z pěti částí a v každé kapitole se probírá jeden nebo více modulů či doplňků, které rozšiřují schopnosti PHP: V první části, "Databáze", se probírají dvě abstraktní databázové vrstvy: v kapitole 1 je to PEAR DB, v kapitole 2 ADODB. Oba balíky poskytují standardní sadu funkcí, s jejichž pomocí se dá rozmlouvat s mnoha druhy databází. To je úplně něco jiného než práce s domácími funkcemi PHP pro přístup k databázím, kdy, například, dotaz na databázi MySQL odesíláte funkcí mysql_query(), kdežto
14 dotaz na databázi Oracle funkcemi ociparse() a ociexecute(). Balík ADODB poskytuje rozhraní podobné standardu ADO společnosti Microsoft pro přístup k datům. Druhá část, "HTML", se podrobně zabývá dvěma balíky, které asistují při řešení běžných úloh generování HTML: HTML_QuickForm v kapitole 3 a Smarty v kapitole 4. HTML_QuickForm spravuje za vás formuláře, zbavuje vás starostí o různé detaily, jako jsou zajištění standardního rozvržení formulářů a zachování standardních hodnot, když se stránka znovu načítá. Smarty je úplný a mocný systém šablon, který vám pomůže oddělit kód aplikace od návrhu stránky. Obsahuje také schopnosti pro práci s cache, jimiž budete moci zefektivnit činnost svých stránek. Ve třetí části, "XML", se prozkoumává rozklad a používání XML v PHP. V kapitole 5 se hovoří o modulu XML_Parser, který poskytuje infrastrukturu pro rozklad založenou na událostech. Kapitoly 6 a 7 se zaobírají s XML-RPC a SOAP, což jsou dva nejpopulárnější formáty založené na XML pro volání vzdálených procedur. Tyto protokoly vám umožní volat funkce, které běží na vzdálených serverech, a okamžitě využít jejich výsledky ve vašich programech PHP. V kapitole 8 se seznámíte se SimpleXML, což je vzrušující rozšíření (jen pro PHP 5), které poskytuje nejpřímější cestu, jak v PHP zpracovávat malé, nepříliš komplikované dokumenty XML. Čtvrtá část, "Networking", se soustřeďuje na dvě úlohy: na odesílání elektronické pošty a na ověřování totožnosti uživatelů (autentizaci). V kapitole 9 se dozvíte, jak snadno se pomocí modulů Mail a Mail_ mime odesílají zprávy elektronické pošty s HTML, s vloženými obrázky, a probírají se zde i další vyspělejší schopnosti. Kapitola 10 ukazuje, jak se dá pomocí modulů Auth a Auth_HTTP implementovat flexibilní řízení přístupu k vašemu webu. V páté části, "Ladění, cache a optimalizace", se podíváme pod kapotu PHP. Kapitola 11 slouží jako přehled interních záležitostí PHP: kroky, jež PHP podniká, když rozkládá a vykonává některý z vašich skriptů jako reakci na nějaký webový požadavek. V kapitole 12 uvidíte Xdebug, což je odlaďovač, který pomáhá diagnostikovat závady v programech. S pomocí Xdebug můžete dokonce pozastavit běh skriptu PHP, abyste mohli prozkoumat proměnné, a podívat se, které funkce se volaly. V kapitole 13 se analyzují tři moduly kódu pro uchovávání kódu v tzv. code cache. Tato rozšíření, také se jim říkává akcelerátory, zvýší rychlost vašeho serveru, aniž byste museli cokoli přepisovat ve svých skriptech.
15
Pošlete nám váš názor Jako čtenáři této knihy se stáváte těmi nejdůležitějšími kritiky a komentátory. Vážíme si vašeho názoru a chtěli bychom znát, co děláme správně, co bychom mohli dělat lépe, ve kterých oblastech bychom měli publikovat a jiné podnětné myšlenky, jež jste nám ochotni sdělit. Jako redaktor vydavatelství Zoner Press vítám vaše názory. Můžete mi poslat e-mail nebo dopis a sdělit mi, co se vám v této knize líbilo nebo nelíbilo, stejně tak, co bychom měli udělat, aby naše další knihy byly lepší. Pokud mi napíšete, prosím, nezapomeňte připojit název knihy, ISBN, jméno autora, vaše jméno, telefon nebo e-mail. Pozorně zhodnotím vaše názory a poskytnu je autorovi a redaktorům, kteří pracovali na této knize. Prosím, vězte, že nemohu pomoci s technickými problémy, které se týkají obsahu knihy, a že díky velkému množství e-mailů, jež dostávám, nemohu zaručit odpověd na každou zprávu. E-mail: miroslav.kucera@zoner.com Adresa: Zoner Press ZONER software, s. r. o. Miroslav Kučera Koželužská 7 602 00 Brno
Stažení zdrojového kódu Zdrojový kód příkladů uvedených v knize je čtenářům k dispozici ke stažení na webové stránce vydavatelství http://www.zonerpress.cz v sekci Soubory ke stažení, resp. přímo na adrese http://www.zonerpress.cz/download/php5-moduly-rozsireni-akceleratory.zip. Veškerý zdrojový kód z knihy je zabalený do jediného souboru ZIP. Uvnitř souboru ZIP je samostatná složka pro každou kapitolu knihy (složky kapitol se jmenují Chapter01 až Chapter13). V jednotlivých složkách jsou jako samostatné čisté textové soubory jednotlivé fragmenty kódu i ucelené příklady uvedené v knize.
16
Informace o PEAR PEAR, neboli PHP Extension and Application Repository, je kolekce tříd PHP, která řeší všelijaké užitečné úlohy, jako jsou komunikace se serverem SOAP, nebo vytváření zpráv elektronické pošty s vloženými obrázky. Rozsáhlou výbavu tříd, které jsou součástí PEAR, si můžete prohlédnout na webu PEAR na adrese http://pear.php.net/. Mnohé ze tříd a doplňků, které se probírají v knize, pocházejí právě z PEAR. Manažer balíku PEAR, což je program příkazového řádku s názvem pear, vám pomůže nainstalovat, modernizovat a odstraňovat balíky PEAR. Tento nástroj se spolu s jistými fundamentálními třídami PEAR instaluje jako součást nových instalací PHP. Můžete si je ale také nainstalovat separátně. Zbytek úvodu ukazuje, jak se pracuje s nástrojem pear příkazového řádku.
Instalace PEAR Manažer balíků PEAR se standardně nainstaluje s verzí 4.3.0 PHP a novějšími. Provozujete-li nějakou starší verzi PHP, nebo jste si manažera balíků nenainstalovali s PHP, budete muset podniknout několik kroků, abyste si ho nainstalovali. Konkrétní kroky závisí na tom, na jakém operačním systému pracujete. Na Unixu se pear nejsnadněji nainstaluje tak, že vydáte příkaz: # lynx -source http://go-pear.org/ | php
Tím stáhnete obsah URL http://go-pear.org/ a pošlete získaný obsah, což je skript PHP, do vaší místní binární distribuce PHP. Stažený skript PHP získá program pear a s ním sdružené podpůrné soubory z webu PEAR, nakonfiguruje je a nainstaluje. Nemáte-li nainstalovaný textový prohlížeč lynx, můžete si pear nainstalovat tak, že navštívíte ve svém obvyklém webovém prohlížeči http://go-pear.org/, uložíte zdrojový kód stránky do nějakého souboru, a pak uložený soubor spustíte prostřednictvím PHP. Jestliže jste si, například, uložili zdroj z http://go-pear.org do souboru /tmp/go-pear.php, pak spusťte tohle: # php /tmp/go-pear.php
Na Windows spusťte dávkový soubor go-pear.bat, který se vám nainstaloval do vaší složky PHP. Například: C:\ > c:\php\go-pear.bat
Na Windows také funguje postup uvedený výše, kdy uložíte obsah http://go-pear.org/, a pak spustíte uložený soubor prostřednictvím PHP. Na Unixu i na Windows tímto instalačním procesem nainstalujete manažera pear a jisté nepostradatelné balíky PEAR, které manažer potřebuje, aby mohl fungovat.
Jak se pracuje s manažerem balíků Manažer pear akceptuje řadu příkazů, které provádějí různé akce týkající se správy balíků. Protože pear potřebuje zapisovat do adresářů, do nichž instaluje moduly, často ho budete musit spustit jako
17 root. V knize jsou příkazy, které je třeba spouštět jako root, mezi něž patří následující příkaz pear, uvozeny výzvou #. Příkazy, které můžete spouštět jako běžný uživatel, jsou uvozeny výzvou $. Chcete-li se podívat na seznam dostupných příkazů, spusťte pear bez argumentů: # pear Usage: pearcmd.php [options] command [command-options] <parameters> Type "pearcmd.php help options" to list all options. Type "pearcmd.php help <command>" to get the help for the specified command. Commands: build
Build an Extension From C Source
bundle
Unpacks a Pecl Package
clear-cache
Clear
config-get
Show One Setting
XML- RPC Cache
config-help
Show Information About Setting
config-set
Change Setting
config-show
Show All Settings
cvsdiff
Run a "cvs diff" for all files in a package
cvstag
Set CVS Release Tag
download
Download Package
download-all
Downloads each available Package from master_server
info
Display information about a package
install
Install Package
list
List Installed Packages
list-all
List All Packages
list-upgrades
List Available Upgrades
login
Connects and authenticates to remote server
logout
Logs out from the remote server
makerpm
Builds an RPM spec file from a PEAR package
package
Build Package
package-dependencies
Show package dependencies
package-validate
Validate Package Consistency
remote-info
Information About Remote Packages
remote-list
List Remote Packages
run-tests
Run Regression Tests
search
Search remote package database
shell-test
Shell Script Test
sign
Sign a package distribution file
uninstall
Un- install Package
upgrade
Upgrade Package
upgrade-all
Upgrade All Packages
18 Mnohé z příkazů, které pear podporuje, jsou prospěšné jen lidem, kteří sami vyrábějí balíky. Zde uvedu pět příkazů, které slouží pro stahování a instalaci balíků: list, install, upgrade, uninstall a help. Chcete-li zjistit, které balíky máte nainstalované, vydejte příkaz pear list: # pear list Installed packages: =================== Package
Version
tate
Archive_Tar
1.1
stable
Console_Getopt 1.0
stable
DB
1.5.0RC1
stable
HTTP
1.2.1
stable
1.1.0
stable
Net_SMTP
1.2.3
stable
Net_Socket
1.0.1
stable
PEAR
1.3b3
beta
XML_Parser
1.0.1
stable
XML_RPC
1.0.4
stable
Pro každý balík PEAR, který máte nainstalovaný na svém stroji, zobrazí příkaz pear název-balíku, číslo verze nainstalovaného balíku, a stav nainstalované verze; balíky jsou obvykle ve stabilním (stable) stavu, někdy si však budete chtít (nebo muset) nainstalovat alfa nebo betaverzi balíku. Chcete-li ke své instalaci přidat nějaký balík, spusťte pear install. Například, chcete-li si nainstalovat balík Mail_mime, který se probírá v kapitole 9, napište: # pear install Mail_mime downloading Mail_Mime-1.2.1.tar ... Starting to download Mail_Mime-1.2.1.tar (-1 bytes) ..................done: 77,312 bytes install ok: Mail_Mime 1.2.1
Když manažerovi balíků sdělíte, aby něco nainstaloval, manažer stáhne archiv balíku z http://pear. php.net, rozbalí jednotlivé soubor z archivu, a pak je zkopíruje na patřičné místo ve vaší vkládací cestě PHP. Chcete-li si ověřit, kde soubory skončí, vydejte příkaz pear config-get, abyste se podívali na obsah konfigurační proměnné php_dir: # pear config-get php_dir php_dir=/usr/local/lib/php
To znamená, že nové moduly PEAR se budou instalovat do /usr/local/lib/php. Aby mohly některé balíky správně fungovat, potřebují, aby už byly nainstalované jiné balíky. Chcete-li nainstalovat nějaký balík se všemi jeho závislostmi, uveďte v příkazu pear install přepínač
19 -a. Například, balík XML_Beautifier závisí na balíku XML_Util. Budete-li instalovat XML_Beautifier bez přepínače -a, dojde k chybě: # pear install XML_Beautifier downloading XML_Beautifier-1.0.1.tgz ... Starting to download XML_Beautifier-1.0.1.tgz (9,837 bytes) .....done: 9,837 bytes requires package 'XML_Util' >= 0.5 XML_Beautifier: Dependencies failed
Uvedete-li přepínač -a, pear stáhne a nainstaluje také balík XML_Util: # pear install -a XML_Beautifier downloading XML_Beautifier-1.0.1.tgz ... Starting to download XML_Beautifier-1.0.1.tgz (9,837 bytes) .....done: 9,837 bytes downloading XML_Util-0.5.2.tgz ... Starting to download XML_Util-0.5.2.tgz (6,540 bytes) ...done: 6,540 bytes install ok: XML_Util 0.5.2 install ok: XML_Beautifier 1.0.1
Existuje-li nová verze balíku, který už máte nainstalovaný, využijte příkaz upgrade. Příkaz stáhne nejnovější verzi balíku, odstraní nainstalovanou verzi a nainstaluje novější verzi. Příkazu upgrade předejte název balíku, který chcete modernizovat. Například, máte-li nainstalovaný Mail_mime 1.2, na verzi 1.2.1 ho zmodernizujete takto: # pear upgrade Mail_mime downloading Mail_Mime-1.2.1.tgz ... Starting to download Mail_Mime-1.2.1.tgz (15,268 bytes) .....done: 15,268 bytes upgrade ok: Mail_Mime 1.2.1
Jestliže máte nainstalovanou nejnovější dostupnou verzi balíku, upgrade vám to řekne a nic instalovat nebude: # pear upgrade Mail_mime Package 'Mail_Mime-1.2.1' already installed, skipping
Chcete-li nějaký balík odstranit, použijte příkaz uninstall. Odstraní zadaný balík a jeho soubory z vašeho systému. Například, chcete-li odinstalovat balík Mail_mime, vydejte příkaz: # pear uninstall Mail_mime uninstall ok: Mail_Mime
20 Manažer balíků standardně neodinstaluje balík, na kterém závisejí jiné balíky. Na balíku Mail_mime závisí balík SOAP, takže máte-li nainstalovaný SOAP, oznámí vám manažer balíků chybu, pokusíte-li se odinstalovat balík Mail_mime: # pear uninstall Mail_Mime Package 'soap' depends on 'Mail_Mime' uninstall failed
Odinstalování si ale můžete vynutit, když manažerovi balíků sdělíte, aby ignoroval závislosti. V příkazu uninstall uveďte přepínač -n: # pear uninstall -n Mail_mime uninstall ok: Mail_Mime
Chcete-li se dozvědět víc o jednotlivých příkazech pear, vydejte příkaz help. Předejte mu název příkazu, o kterém se chcete dozvědět více informací. Například: # pear help uninstall pearcmd.php uninstall [options] <package> ... Uninstalls one or more PEAR packages.
More than one package may be
specified at once. Options: -n, --nodeps ignore dependencies, uninstall anyway -r, --register-only do not remove files, only register the packages as not installed -R DIR, --installroot=DIR root directory used when installing files (ala PHP's INSTALL_ROOT) --ignore-errors force install even if there were errors
Příkaz help options se hodí zejména tehdy, potřebujete-li si vypsat všechny volby, které akceptují všechny příkazy pear. Patří mezi ně úlohy jako ignorování závislostí balíků, nebo změna adresáře, do kterého má pear ukládat své balíky.
Kapitola 4
Šablony se Smarty V mnoha ohledech je i samotné PHP strojem na šablony. Text, který se nachází vně značek <?php a ?>, se zobrazí nezměněný, příkazy uvnitř těchto značek se rozloží a vykonají. Stránka PHP, která zobrazuje statické záhlaví, získá několik řádků z nějaké databáze, naformátuje je do tabulky HTML, a nakonec zobrazí statické zápatí, vlastně do statické šablony zapojuje dynamická data. Mít specializovaný stroj na šablony, jakým je Smarty, je cenné, protože vynucuje disciplinované oddělování prezentační logiky od logiky aplikace. Přestože můžete budovat stránky šablon čistě jen s PHP, je obtížné zabránit programátorům a designérům stránek, aby si navzájem nelezli do zelí, když je vaším jazykem šablon PHP. Se Smarty se vám snadněji podaří uskutečnit, aby se designéři soustřeďovali jen na implementaci rozvržení a prezentační logiky, a programátoři aby se zase soustředili jen na implementaci logiky aplikace v separátních třídách a funkcích PHP. Taková separace je prospěšná z mnoha důvodů, nejen kvůli zlepšení pracovní disciplíny. Web založený na šablonách je flexibilní web: chcete-li aktualizovat design webu, stačí změnit šablony. Klíčová logika, která zobrazuje články, prohledává databáze, či zobrazuje nějaký katalog výrobků, zůstane netknutá; mění se ale vzhled výsledků. Z toho plyne, že šablony také značně ulehčují proces vytváření mnoha rozhraní pro stejný obsah. Lze rozmisťovat jedinečná rozhraní pro různé prohlížeče, různé jazyky, nebo různé obchodní partnery. Každý prohlížeč, jazyk, či partner, získá svou vlastní sadu šablon, ale všechna rozhraní budou sdílet touž aplikační logiku. Většina textu kapitoly podrobně vysvětluje, jak se za pomoci Smarty vybuduje web založený na šablonách. Prozkoumáme ale také caching šablon, což přináší další zisky, když pracujete se Smarty. Výkon webu se zvyšuje tím, že se ukládají statické kopie neměněných dynamických informací. Například zobrazíte-li na své průčelní stránce novinové titulky, přičemž se váš kanál (feed) s titulky mění jen každých 15 minut, není třeba vytahovat titulky z kanálu pokaždé, když generujete svou průčelní stránku. Pomocí těchto schopností Smarty si můžete uchovat kopii titulků po dobu 15 minut do cache a automaticky přebudovávat seznam titulků teprve tehdy, až to bude nutné.
108
Kapitola 4 – Šablony se Smarty
Instalace a konfigurace Smarty Smarty nainstalujete a nakonfigurujete ve čtyřech krocích: 1. Stáhněte distribuci a rozbalte ji. 2. Zkopírujte soubory knihovny z distribuce do svého cílového adresáře. 3. Vytvořte adresáře pro šablony, kompilované šablony a pro cache stránek. 4. Určete správný způsob, jakým se bude vyvolávat Smarty z vašich skriptů PHP. Smarty získáte tak, že navštívíte http://smarty.php.net/download.php, a pomocí patřičného odkazu přejdete na stránku, odkud si můžete stáhnout zdrojový kód Smarty. V kapitole se popisuje Smarty verze 2.6.0. Smarty se distribuuje jako soubor tar.gz, takže rozbalte archiv a extrahujte soubory takto: % gunzip -c Smarty-2.6.0.tar.gz | tar xf -
Pracujete-li na Windows, můžete soubory tar.gz zpracovávat vhodnou utilitou, jakou je například program WinZip. V dalším kroku je třeba zkopírovat jisté soubory z distribuce Smarty do jistého cílového adresáře. Adresář by měl být vně stromu dokumentů vašeho webu. Jestliže cílový adresář není na vaší vkládací cestě PHP (include_path), musíte nastavit konstantu SMARTY_DIR na název adresáře, včetně koncového lomítka. V kapitole používáme jako cílový adresář /usr/lib/php/smarty, můžete však použít libovolný adresář, podmínkou ale je, aby uživatel, pod kterým běží webový server, měl oprávnění z tohoto adresáře číst. Jestliže cílový adresář ještě neexistuje, vytvořte ho, a zkopírujte tam vše, co se nachází v podadresáři libs distribuce Smarty: # mkdir -p /usr/lib/php/smarty # cp -pR Smarty-2.6.0/libs/* /usr/lib/php/smarty
Až soubory zkopírujete, budete muset připravit několik adresářů, a zkontrolovat, zda mají nastavena správná povolení. Adresáře se musejí vytvořit pro šablony, konfigurační soubory, kompilované šablony a pro cache stránek. Do adresářů pro kompilované šablony a cache stránek musí mít povoleno zapisovat ten uživatel, pod kterým běží váš webový server. Do adresářů pro šablony a konfigurační soubory musí mít povoleno zapisovat kterýkoli uživatel, který má mít oprávnění editovat nějakou šablonu či konfigurační soubor — tedy editoři a designéři vašeho webu. Adresář pro šablony pojmenujeme templates: # mkdir /usr/lib/php/smarty/templates
Adresář pro konfigurační soubory pojmenujeme configs: # mkdir /usr/lib/php/smarty/configs
Adresář pro kompilované šablony pojmenujeme templates_c: # mkdir /usr/lib/php/smarty/templates_c
Adresář pro cache stránek pojmenujeme cache:
PHP 5 – moduly, rozšíření a akcelerátory
109
# mkdir /usr/lib/php/smarty/cache
Řádně se nastaví povolení pro adresáře templates_c a cache nejsnadněji tak, že jakožto superuser změníte vlastníka adresářů na toho uživatele, pod kterým běží váš webový server: # chown nobody /usr/lib/php/smarty/templates_c # chown nobody /usr/lib/php/smarty/cache
Uživatel, pod kterým běží webový server, musí mít možnost do těchto adresářů zapisovat, protože když Smarty běží, ukládá do nich soubory. Pak změňte patřičně povolení pro adresáře templates a configs. Patří-li všichni designéři například do skupiny siteedit, vykonejte tyto příkazy: # chgrp siteedit /usr/lib/php/smarty/configs # chgrp siteedit /usr/lib/php/smarty/templates # chmod g+w /usr/lib/php/smarty/configs # chmod g+w /usr/lib/php/smarty/templates
Tím změníte skupinu adresářů configs a templates na siteedit a povolíte všem uživatelům, kteří jsou členy skupiny siteedit, aby mohli do těchto adresářů zapisovat. Jestliže jste vytvořili adresáře správně, měl by výpis vašich připravených adresářů vypadat podobně jako následující (časy modifikace souborů jsem vynechal, aby byly řádky kratší): drwxr-xr-x
2 nobody
root
4096
cache
-rw-rw-r--
1 sklar
wheel
9946
Config_File.class.php
drwxrwxr-x
2 root
siteedit
4096
configs
drwxrwsr-x
2 sklar
wheel
4096
core
-rw-rw-r--
1 sklar
wheel
5017
debug.tpl
drwxrwsr-x
2 sklar
wheel
4096
-rw-rw-r--
1 sklar
wheel
65531
Smarty.class.php
plugins
-rw-rw-r--
1 sklar
wheel
76885
Smarty_Compiler.class.php
drwxrwxr-x
2 root
siteedit
4096
templates
drwxr-xr-x
2 nobody
root
4096
templates_c
Adresáře cache a templates_c vlastní nobody a pouze ten uživatel do nich může zapisovat. Do adresářů configs a templates může zapisovat kdokoli ze skupiny siteedit. Zbývající soubory a adresáře mohou číst všichni uživatelé. Posledním krokem v přípravě Smarty je určit správné hodnoty pro konfigurační nastavení Smarty. Veškerá interakce se Smarty se ve skriptech PHP děje prostřednictvím objektu, který je instancí třídy Smarty definované v souboru Smarty.class.php. Jakmile máte instanci objektu Smarty, musí se některé jeho vlastnosti nastavit tak, aby ukazovaly na adresáře, které jste si vytvořili: define('SMARTY_DIR','/usr/lib/php/smarty/'); require SMARTY_DIR.'Smarty.class.php'; $smarty = new Smarty; $smarty->template_dir = SMARTY_DIR.'templates/';
110
Kapitola 4 – Šablony se Smarty
$smarty->compile_dir = SMARTY_DIR.'templates_c/'; $smarty->config_dir = SMARTY_DIR.'configs/'; $smarty->cache_dir = SMARTY_DIR.'cache/';
Jakmile máte instanci objektu Smarty a nastavili jste jeho vlastnosti uvedené výše, můžete začít komunikovat prostřednictvím $smarty. Nastavovat proměnné a vyvolávat šablony tak, jak se popisuje ve zbytku kapitoly. Přestože žádný z příkladů neobsahuje tyto úvodní řádky, předpokládá se, že běží v nějakém skriptu, jehož úvodní část byla připravená výše uvedeným postupem.
Základní pojmy Smarty Šablona Smarty je něco jako kulisa kosmonauta nebo topmodelky v životní velikosti, která má díru na místě, kde by měl hlavu skutečný kosmonaut, resp. topmodelka, takže se můžete dát vyfotit v roli kosmonauta nebo topmodelky, když dírou prostrčíte svou hlavu. Na každé fotografii bude většina obrázku stejná. Jen zubící se obličej prostrčený dírou bude jiný. Šablona obsahuje prezentované informace, které se nemění, jako jsou záhlaví, nabídky, nebo zápatí. Když budujete nějakou stránku založenou na šabloně, přidá Smarty do šablony něco dynamických dat, která jsou specifická pro daný požadavek – prostrčí dírou konkrétní zubící se obličej. Všeobecně se jedná o tři kroky, když chcete v nějakém skriptu PHP zprovoznit Smarty: Vytvoří se instance objektu Smarty (to jsme podrobně popsali v předchozím oddílu), přiřadí se proměnné objektu Smarty a zobrazí se šablona. Proměnné přiřazené objektu Smarty do šablony se vsunou, když se šablona zobrazuje. Výpis 4-1 je taková šablona. Zobrazuje informace o jedné z příchutí zmrzliny. Přijde do podadresáře templates SMARTY_DIR. V šabloně je definované formátování informací, podobnosti o příchuti se ale objektu Smarty přiřazují vně šablony. Výpis 4-1. icecream.tpl. <html> <head><title>Zmrzlina: {$flavor}</title></head> <body> <h1>{$flavor}</h1> <table
border="1">
<tr><th colspan="2">Příchuť {$flavor}</th></tr> <tr><td>Počet kalorií</td><td>{$calories}</td></tr> <tr><td>Cena</td><td>${$price}</td></tr> </table> </body> </html>
V šabloně indikují složené závorky, že se jedná o příkazy a funkce Smarty. Nejzákladnějším příkazem je vložit hodnotu proměnné. Když dáte název proměnné do složených závorek, způsobí to, že když se šablona zobrazuje, dosadí se místo proměnné její hodnota. Chcete-li zobrazit nějaké informace o čo-
PHP 5 – moduly, rozšíření a akcelerátory
111
koládové zmrzlině, vyvolejte icecream.tpl ve skriptu PHP z výpisu 4-2. Skript by měl být uložen ve stromu dokumentů webového serveru. Výpis 4-2. chocolate.php. $smarty->assign('flavor','Chocolate'); $smarty->assign('calories',10); $smarty->assign('price',4.55); $smarty->display('icecream.tpl');
Tři volání $smarty->assign() přiřazují v objektu $smarty konkrétní hodnoty proměnným šablony s názvy flavor, calories a price. Voláním $smarty->display('icecream.tpl') sdělujete objektu $smarty, aby načetl šablonu uloženou v souboru icecream.tpl, vykonal všechny příkazy, které v šabloně najde, a zobrazil výsledky. V našem případě se vykonávání příkazů skládá jen z dosazení hodnot několika proměnných. Výsledkem je tento HTML: <html> <head><title>Zmrzlina: Chocolate</title></head> <body> <h1>Chocolate</h1> <table border="1"> <tr><th colspan="2">Příchuť Chocolate</th></tr> <tr><td>Počet kalorií</td><td>10</td></tr> <tr><td>Cena</td><td>$4.55</td></tr> </table> </body> </html>
Prospěšnost a síla šablonového stroje se ozřejmí, až nastane chvíle, kdy máte zobrazit stránku o vanilkové zmrzlině. Takovou stránku vytváří výpis 4-3. Stránka má stejné rozvržení jako stránka pro čokoládovou zmrzlinu. Výpis 4-3. vanilla.php. $smarty->assign('flavor','Vanilla'); $smarty->assign('calories',20); $smarty->assign('price',4.25); $smarty->display('icecream.tpl');
Zobrazí se prakticky identická stránka – jediným rozdílem jsou jiné dosazené hodnoty. Až dostanete za úkol změnit rozvržení stránky prezentující informace o různých příchutích zmrzlin, bude stačit aktualizovat jen soubor icecream.tpl. Skripty PHP, které vyvolávají šablonu, budou těžit ze změněné šablony, aniž byste v nich museli cokoli měnit.
112
Kapitola 4 – Šablony se Smarty
Používání proměnných v šabloně Jádrem systému šablon je dosazování hodnot za proměnné. Když zkombinujete různé sady proměnných s různými šablonami, můžete vyprodukovat celou paletu různých stránek. Aplikování stejných proměnných na různé šablony je běžné, když zobrazujete výstup na různých platformách nebo v různých prohlížečích. Představte si například, že nějaký web, který prezentuje novinové články, má svůj obsah přizpůsobit podle druhu prohlížeče a připojení čtenáře. Web bude mít jednu šablonu pro webové prohlížeče na vysokorychlostních připojeních, jednu pro webové prohlížeče s nízkou rychlostí, a jednu pro mobilní zařízení, jako jsou mobily a organizéry. Když vznikne požadavek na nějaký článek, shromáždí web z databáze nebo z nějakého souboru patřičná data článku, tedy titulek, podtitulek, tělo a URL obrázků. Pak, v závislosti na tom, jaký prohlížeč o článek žádal, vyvolá web odpovídající šablonu Smarty. Každá šablona naformátuje data článku jinak. Například šablona pro vysokorychlostní připojení bude obsahovat všechny obrázky, kdežto šablona pro mobilní zařízení všechny obrázky vyhodí a zobrazí jen holý text. Když web novin zobrazuje různé články na stejném druhu prohlížeče, používá různé sady proměnných a jedinou šablonu. Když nějaký konkrétní článek požaduje prohlížeč s vysokorychlostním připojením, získají se data článku a vstrčí do šablony článků určené pro vysokorychlostní připojení. Když se pak požaduje jiný článek, získají se jiná data a vstrčí do téže šablony. Jednotlivé články lze editovat, aniž by to mělo na šablonu nějaký vliv. Šablonu můžete zase editovat, aniž byste tím nějak změnili data nějakého konkrétního článku. Šablonová struktura odděluje obsah webu (články) od vzhledu a rozvržení webu. Jak jsme si ukázali v předchozím oddílu, přiřazuje metoda assign() hodnoty proměnným šablony, a metoda display() zobrazuje šablonu. Místo jednotlivých dvojic název/hodnota, přijímá assign() jako argument také asociativní pole. Klíče prvků asociativního pole použije jako názvy proměnných šablony, hodnoty prvků jako hodnoty proměnných šablony. Stránku pro vanilkovou zmrzlinu můžete například vytvořit také takto: $smarty->assign(array('flavor' => 'Vanilla', 'calories' => 20, 'price' => 4.25)); $smarty->display('icecream.tpl');
Proměnné požadavku Smarty zpřístupňuje proměnné požadavku prostřednictvím prvků speciální proměnné $smarty. Proměnné GET jsou ve $smarty.get, proměnné POST ve $smarty.post, proměnné cookie ve $smarty.cookies, proměnné prostředí ve $smarty.env, serverové proměnné ve $smarty.server a proměnné sezení ve $smarty.session. Má-li konfigurační proměnná request_use_auto_ globals Smarty hodnotu true, získává Smarty proměnné požadavku ze superglobálních polí: $_GET, $_POST, $_COOKIE, $_ENV, $_SERVER a $_SESSION. Jinak bude používat starší globální pole: $HTTP_ GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_ENV_VARS, $HTTP_SERVER_VARS a $HTTP_SESSION_VARS. Bez ohledu na to, zda je request_use_auto_globals nastavena na true nebo ne, zpřístupňuje Smarty prvky superglobálního pole $_REQUEST v $smarty.request.
PHP 5 – moduly, rozšíření a akcelerátory
113
Modifikátory proměnných Často je třeba nahradit proměnné mírně upravenými hodnotami. V těchto případech přicházejí na scénu modifikátory. Modifikátory proměnných jsou drobné funkce s omezeným rozsahem působnosti, které produkují nový výsledek založený na nějaké proměnné. Nemění původní proměnnou, dodají její novou verzi – se samými velkými písmeny, nebo obsahující počet znaků proměnné, nebo jinak naformátovanou. Modifikátor se používá tak, že se za název proměnné přidá | a název modifikátoru. Smarty nijak nekóduje entity, a ani nijak jinak nemění proměnné požadavku, takže musíte být velmi opatrní, abyste zamezili útokům z jiných skriptů, a jiným nežádoucím jevům, k nimž by mohlo docházet v důsledku toho, že nekontrolujete vstupy od uživatelů. Odeslaná data zobrazíte bezpečně tak, že uvedete modifikátor escape. Například, má-li $_REQUEST['link'] hodnotu <a href="/chocolate.php">Ňam ňam!</a>, pak: {$smarty.request.link|escape}
zobrazí hodnotu $_REQUEST['link'] se zakódovanými entitami HTML: &lt;a href=&quot;/chocolate.php&quot;&gt;Ňam ňam!&lt;/a&gt;
Některé modifikátory proměnných přebírají argumenty. Uvádějí se jako seznam oddělovaný dvojtečkami za názvem modifikátoru. Například modifikátor cat přidá nakonec proměnné řetězec. Připojovaný řetězec se uvede jako argument: {$flavor|cat:" Fudge"}
Jestliže se do proměnné $flavor šablony dosadila hodnota Vanilla, zobrazí šablona: Vanilla Fudge
Modifikátory proměnné se také dají řetězit. Chcete-li výstup jednoho modifikátoru zpracovat jiným modifikátorem, umístěte za první modifikátor znak | a druhý modifikátor: {$flavor|cat:" Fudge"|upper}
Jestliže se do proměnné $flavor šablony dosadila hodnota Vanilla, zobrazí šablona tohle: VANILLA FUDGE
Zpracování textu Příklady předvádějící modifikátory pro zpracování textu se opírají o následující přiřazené proměnné: $smarty->assign(array('flavor' => 'Chocolate Smoked Oyster', 'quote' => 'Každý říká, "Mám rád Chocolate smoked oyster!"', 'quote2' => "Je to moje nejoblíbenější příchuť!", 'price' => 5, 'spaced_flavor' => "
Chocolate
Smoked\n\nOyster",
'link' => '<a href="ustrice.php">Ústřice</a>', 'address' => 'oyster@example.com', 'description' => 'Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa
114
Kapitola 4 – Šablony se Smarty
vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity parné tropické džungle, ve které dozrávají kakaové boby, a čerstvého povětří Nové Anglie, kde jsou domovem ústřice.'));
Některé z modifikátorů Smarty pro zpracování textu se podobají zabudovaným funkcím PHP. Vztahy mezi modifikátory pro zpracování textu a funkcemi PHP jsou vypsané v tabulce 4-1. Tabulka 4-1. Modifikátory Smarty pro zpracování textu a ekvivalenty z PHP. Funkce nebo operátor PHP
Modifikátor
Popis
ucwords()
capitalize
Převede první písmeno v každém slově na velké.
. (operátor řetězení řetězců)
cat
Zkombinuje dva řetězce.
htmlspecialchars()
escape
Předznačí apostrofy, úhlové závorky a ampersandy.
htmlentities()
escape
Předznačí všechny entity HTML.
urlencode()
escape
Předznačí hexadecimálně všechny znaky, které nejsou alfanumerické (kromě _).
strtolower()
lower
Převede všechna písmena v řetězci na malá.
nl2br()
nl2br
Převede znaky nového řádku (newline) na značky <br />.
str_replace()
replace
Nahrazuje v řetězci.
preg_replace()
regex_replace
Nahradí řetězec, který vyhovuje regulárnímu výrazu.
sprintf()
string_format
Vytiskne naformátovaný řetězec.
strtoupper()
upper
Převede všechna písmena v řetězci na velká.
wordwrap()
wordwrap
Vloží do řetězce znaky pro nový řádek, aby se zalamoval na určité délce.
capitalize Modifikátor capitalize převede první písmeno ve všech slovech proměnné na velké. Například: {$quote|capitalize}
Výstup ukázky je: Každý Říká, "Mám Rád Chocolate Smoked Oyster!"
cat Modifikátor cat připojí na konec proměnné zadaný řetězec. Například: {$flavor|cat:" Sauce"}
Výstup ukázky je: Chocolate Smoked Oyster Sauce
PHP 5 – moduly, rozšíření a akcelerátory
115
escape Modifikátor escape předznačí speciální znaky v proměnné. Parametr předaný do escape určuje, jaké předznačování se bude dít. Standardně, nebo s parametrem html, se předznačují znaky <, >, &, " a '. S parametrem quotes se předznačují apostrofy. S parametrem htmlall se předznačují všechny entity HTML. S parametrem url se speciální znaky zakódují jako v URL. S parametrem javascript se předznačují apostrofy, obrácená lomítka a znaky pro nový řádek (newline). S parametrem hex se každý znak převede na hexadecimální vyjádření jako v URL. S parametrem hexentity se každý znak převede na hexadecimální vyjádření jako v kódování entit. Tím se dají trochu zamaskovat e-mailové adresy před lovícími roboty. Ukázky: {* První dvě jsou stejné *} {$link|escape} {$link|escape:"html"} {$quote2|escape:"quotes"} {$link|escape:"htmlall"} {$quote|escape:"url"} {$quote2|escape:"javascript"} {$flavor|escape:"hex"} {$address|escape:"hexentity"} Výstup z ukázek: &lt;a href=&quot;ustrice.php&quot;&gt;Ústřice&lt;/a&gt; &lt;a href=&quot;ustrice.php&quot;&gt;Ústřice&lt;/a&gt; Moje nejoblíbenější příchuť, \'si piš! &lt;a href=&quot;ustrice.php&quot;&gt;Ústřice&lt;/a&gt; Každý+říká%2C+%22Mám+rád+Chocolate+smoked+oyster%21%22 Moje nejoblíbenější příchuť, \'si piš! %43%68%6f%63%6f%6c%61%74%65%20%53%6d%6f%6b% 65%64%20%4f%79%73%74%65%72 &#x6f;&#x79;&#x73;&#x74;&#x65;&#x72;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c; &#x65;&#x2e;&#x63;&#x6f;&#x6d;
indent Modifikátor indent odsadí řetězec při každém přechodu na nový řádek. (Nevloží konce řádků do řetězce.) Standardně indent odsazuje pomocí čtyř mezer. Jako první parametr můžete specifikovat, kolik znaků se má vložit. Jako druhý parametr můžete uvést jiný znak, nechcete-li odsazovat pomocí mezer. Ukázky použití: {$description|indent} {$description|indent:2} {$description|indent:2:"-"}
116
Kapitola 4 – Šablony se Smarty
Výstup ukázek: Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity parné tropické džungle, ve které dozrávají kakaové boby, a čerstvého povětří Nové Anglie, kde jsou domovem ústřice. Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity parné tropické džungle, ve které dozrávají kakaové boby, a čerstvého povětří Nové Anglie, kde jsou domovem ústřice. --Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa --vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity --parné tropické džungle, ve které dozrávají kakaové boby, --a čerstvého povětří Nové Anglie, kde jsou domovem ústřice.
lower Modifikátor lower převede všechna písmena v proměnné na malá. Například: {$flavor|lower}
Výstup ukázky bude: chocolate smoked oyster
nl2br Modifikátor nl2br přidá značku <br /> před každý znak newline v řetězci. Hodí se to pro zachování pevných konců řádků v textovém souboru, když se zobrazuje jako HTML. Ukázka použití: {$description|nl2br}
Výstup ukázky bude: Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa<br /> vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity<br /> parné tropické džungle, ve které dozrávají kakaové boby, <br /> a čerstvého povětří Nové Anglie, kde jsou domovem ústřice.
regex_replace Modifikátor regex_replace nahradí ten text v proměnné, který vyhovuje zadanému regulárnímu výrazu. Používá funkci preg_replace() PHP, takže se mu musí dodat regulární výraz kompatibilní s Perlem. Prvním parametrem regex_replace je regulární výraz, včetně oddělovačů, podle kterého se hledá. Druhý parametr je řetězec, kterým se nahradí text vyhovující regulárnímu výrazu.
PHP 5 – moduly, rozšíření a akcelerátory
117
Ukázka použití: {$flavor|regex_replace:"/[aeiou]/":"*"}
Výstup ukázky je: Ch*c*l*t* Sm*k*d Oyst*r
replace Modifikátor replace nahrazuje v proměnné pomocí funkce str_replace() PHP jeden řetězec jiným řetězcem. První parametr je řetězec, který se hledá. Druhý parametr je řetězec, který nahradí nalezené výskyty prvního řetězce. Ukázka použití: {$flavor|replace:"e":"3"}
Výstup z ukázky je: Chocolat3 Smok3d Oyst3r
spacify Modifikátor spacify oddělí znaky v proměnné mezerou. Jako parametr můžete předat jiný oddělující znak. Ukázky použití: {$flavor|spacify} {$flavor|spacify:"-"}
Výstup z ukázek je: C h o c o l a t e
S m o k e d
O y s t e r
C-h-o-c-o-l-a-t-e- -S-m-o-k-e-d- -O-y-s-t-e-r
string_format Modifikátor string_format formátuje řetězec pomocí funkce sprintf() PHP. Formát předejte jako parametr. Ukázka použití: {$price|string_format:"%.2f"}
Výstup ukázky: 5.00
118
Kapitola 4 – Šablony se Smarty
strip Modifikátor strip převede všechny posloupnosti prázdných znaků v řetězci na jedinou mezeru. Každá skupina znaků tab, newline, nebo mezer se převede na jedinou mezeru. Předáte-li jako parametr nějaký řetězec, budou se prázdné znaky nahrazovat jím. Ukázky použití: {$spaced_flavor|strip} {$spaced_flavor|strip:"&nbsp;"}
Výstup z ukázek: Chocolate Smoked Oyster &nbsp;Chocolate&nbsp;Smoked&nbsp;Oyster
strip_tags Modifikátor strip_tags odstraní z řetězce značky HTML. Ukázka použití: {$link|strip_tags}
Výstup z ukázky: Ústřice
truncate Modifikátor truncate zkrátí řetězec na 80 znaků. Jestliže nějaké znaky z řetězce odřízne, přidá na konci řetězce tři tečky, které indikují, že byl řetězec zkrácen. Jako první parametr můžete zadat jinou délku, na kterou se zkracuje, a jako druhý parametr jiný indikátor zkrácení. Standardně truncate nedělí slova, když řetězec zkracuje. Chcete-li, aby uřezával i uprostřed slov, předejte jako třetí parametr true. Ukázka použití: {$description|truncate} {$description|truncate:40} {$description|truncate:40:" ! "} {$description|truncate:40:" ! ":true}
Výstup z ukázek: Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem... Smícháním zemitosti uzených... Smícháním zemitosti uzených ! Smícháním zemitosti uzených úst !
PHP 5 – moduly, rozšíření a akcelerátory
119
upper Modifikátor upper převede všechna písmena v proměnné na velká. Ukázka použití: {$flavor|upper}
Výstup ukázky: CHOCOLATE SMOKED OYSTER
wordwrap Modifikátor wordwrap vloží do řetězce konce řádků, takže žádný řádek nebude příliš dlouhý. Standardně zalamuje řetězec na 80 znaků, jako znak konce řádku použije \n, a nekončí řádek uprostřed slova. Přijímá jako první parametr délku řádků, a jako druhý parametr řetězec pro konec řádků. Ukázky použití: {$description|wordwrap} {$quote|wordwrap:20} {$quote|wordwrap:20:"\n\n"}
Výstup z ukázek: Smícháním zemitosti uzených ústřic a čokolády s vysokým obsahem kakaa vykouzlí zmrzlina Chocolate Smoked Oyster simultánně pocity parné tropické džungle, ve které dozrávají kakaové boby, a čerstvého povětří Nové Anglie, kde jsou domovem ústřice. Každý říká, "Mám rád Chocolate smoked oyster!" Každý říká, "Mám rád Chocolate smoked oyster!"
Počty znaků, slov, vět a odstavců textu Jedná se o modifikátory, které poskytují statistiky o délce proměnné, což se hodí, když potřebujete vypočítávat nějaké zobrazovací parametry. V příkladech se používá proměnná s následujícím obsahem: $smarty->assign('dobrozdani',"Tohle je nejlepší zmrzlina na světě a okolí. Nikdy jsem nejedl nic, co by chutnalo tak kouřově, čokoládově a ústřicově. Je vám tedy jasné, že schlamstnu denně dva poháry!");
count_characters Modifikátor count_characters oznámí počet znaků v proměnné, kromě prázdných znaků. Chcete-li započítat i prázdné znaky, předejte jako parametr true.
120
Kapitola 4 – Šablony se Smarty
Ukázky použití: {$dobrozdani|count_characters} {$dobrozdani|count_characters:true}
Výstup ukázek: 160 188
count_words Modifikátor count_words oznámí počet slov v proměnné. Slova jsou pro něj podřetězce oddělené prázdným znakem, které obsahují alfanumerické znaky. Řetězec 2 plus 2 obsahuje tři slova; řetězec 2 + 2 má dvě slova. Ukázka použití: {$dobrozdani|count_words}
Výstup ukázky: 29
count_sentences Modifikátor count_sentences spočte počet vět v proměnné. Dělá to tak, že zjistí počet teček, které mají před sebou nějaké slovo, ale ne za sebou. Podle modifikátoru count_sentences je tedy řetězec example.com is great! example.net v pořádku, je to jedna věta. Tečky v názvech hostitelů se ignorují, protože za nimi okamžitě následuje slovo. Vykřičník se ignoruje, protože nekončí tečkou. Ukázka použití: {$dobrozdani |count_sentences}
Výstup ukázky: 2
count_paragraphs Modifikátor count_paragraphs spočte počet odstavců v proměnné. Sečte počet znaků pro nový řádek a pro konec řádku. Ukázka použití: {$dobrozdani |count_paragraphs}
Výstup ukázky: 2
PHP 5 – moduly, rozšíření a akcelerátory
121
Ostatní modifikátory Zbývající dva modifikátory také poskytují užitečné schopnosti: jsou to default a date_format.
default Modifikátor default dodá hodnotu, když nebyla definována proměnná, za kterou se má dosadit hodnota. Ukázky použití: {* Do $exotic_flavor nebyla přiřazena žádná hodnota*} {* Do $flavor byla přiřazena hodnota "Chocolate" *} {$exotic_flavor|default:"Vanilla"} {$flavor|default:"Green Tea"}
Výstup ukázek: Vanilla Chocolate
date_format Modifikátor date_format poskytuje pomocí funkce strftime() PHP naformátované řetězce obsahující datum a čas. date_format můžete využít v součinnosti se speciální proměnnou $smarty.now, která obsahuje aktuální čas jako časovou známku epochy. Výchozí formátovací řetězec pro date_format je %b %e, %Y. Potřebujete-li jiný formát, specifikujte ho jako první parametr date_format. Kromě toho můžete specifikovat jako druhý parametr výchozí čas. To se hodí, je-li proměnná, kterou date_format modifikuje, prázdná. Druhý parametr se předává interně do strtotime(), takže můžete předávat relativní časy, jako jsou yesterday (včera) nebo last Thursday (poslední čtvrtek). Ukázky použití: {$smarty.now|date_format} //Dnes je středa, 12. ledna 2005 {$smarty.now|date_format:"%c"} {$missing_date|date_format:"%c":"next Tuesday"} // Příští úterý bude 25. ledna
Výstup ukázek: Jan 12, 2005 01/12/05 19:32:13 01/25/05 00:00:00
Komentáře Šablony Smarty mohou obsahovat komentáře. Na vygenerovaných stránkách nejsou komentáře vidět. Komentář dáte do šablony tak, že jeho text obklopíte oddělovači {* a *}:
Kapitola 12
Profilování a ladění s Xdebug Naučte se efektivně optimalizovat své programy PHP s rozšířením Xdebug. S ním budete moci ve svých programech prozkoumávat tok funkčních volání a získávat podrobné statistiky o tom, jak dlouho trvalo vykonání jednotlivých funkcí. Soustředíte-li své úsilí na nejpomalejší části svého programu, vytěžíte maximum z času stráveném optimalizacemi a laděním. Xdebug také podporuje vzdálené ladění. Má pro vás vzdáleného ladicího klienta. V režimu vzdáleného ladění se váš běžící skript PHP spojí se vzdáleným ladicím klientem. U tohoto klienta budete moci v běžícím skriptu prozkoumávat proměnné, zastavovat běh na konkrétním řádku, a dívat se pod kapotu běžícího programu PHP. V kapitole se probírá Xdebug verze 1.3.0.
Instalace Xdebug Nejsnadněji se Xdebug nainstaluje příkazem pear install: % pear install xdebug
Tím modul Xdebug nainstalujete do své instalace PHP. Protože je Xdebug rozšíření PHP napsané v C, potřebuje pear install vědět, kde je umístěný váš kompilátor C a znát několik dalších konfiguračních nastavení. Jestliže vám instalace přes PEAR nefunguje (například proto, že máte svůj kompilátor C na nějakém nestandardním umístění), máte dvě další možnosti: stáhnout binární modul Xdebug z http://www.xdebug.org, nebo si stáhněte zdrojový kód a vybudujte si Xdebug sami. Na hlavní stránce http://www.xdebug.org/ najdete odkazy na dostupné binární moduly Xdebug, které lze stáhnout. Zkopírujte stažený soubor (s příponou .so pro Linux a Mac OS X, nebo s příponou .dll pro Windows) do patřičného adresáře, kde máte rozšíření1. Chcete-li vybudovat Xdebug na Unixu, stáhněte archiv zdrojového kódu .tar.gz z http://www. xdebug.org/ a rozbalte ho. Přejděte do adresáře xdebug-1.3.0/ a spusťte phpize, abyste vytvořili nezbytné konfigurační skripty2. Pak spusťte ./configure a make, abyste vybudovali soubor
278
Kapitola 12 – Profilování a ladění s Xdebug
xdebug.so. Nakonec spusťte make install, abyste soubor xdebug.so zkopírovali do adresáře pro rozšíření PHP. Možná budete muset make install spustit jako superuživatel, abyste měli potřebná
přístupová povolení. Ale ať už jste Xdebug nainstalovali s pear install, používáte nějaký binární modul, nebo jste ho vybudovali ze zdrojového kódu, musíte upravit konfiguraci PHP tak, aby o Xdebug věděla. Přidejte do souboru php.ini řádek zend_extension, kterým specifikujete umístění souboru xdebug.so. Například takto: zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so
Používáte-li CGI nebo CLI verzi PHP, pak binární modul PHP čte soubor .ini pokaždé, když se spustí, takže bude PHP o Xdebug vědět okamžitě. Používáte-li nějaký webový server – vloženou verzi PHP, musíte restartovat webový server, aby PHP signalizoval, že došlo ke konfiguračním změnám.
Funkce pro sledování Sledování v Xdebug znamená, že bude ve vašich programech PHP sledovat volání funkcí. Chcete-li se podívat na seznam všech volání funkcí ve svém programu, zavolejte xdebug_start_trace(), čímž sdělíte Xdebug, aby začal sledovat volání funkcí. Pak zavolejte xdebug_dump_function_trace(), abyste si vytiskli seznam volání od chvíle, kdy jste zavolali xdebug_start_trace(). Krátký program ve výpisu 12-1 zjišťuje počet písmen a jiných znaků v hodnotě proměnné $phrase. Výstup xdebug_ dump_function_trace(), který vidíte na obrázku 12-1, ilustruje, kdy a kde se jednotlivé funkce z výpisu 12-1 volaly. Výpis 12-1. Počítání písmen a sledování volání funkcí. xdebug_start_trace(); function letter() {
$GLOBALS['letter']++; }
function something_else() {
$GLOBALS['something_else']++; }
$phrase = "Is 5 OK?"; for ($i = 0, $j = strlen($phrase); $i < $j; $i++) { if (preg_match('/[[:alpha:]]/', $phrase{ $i} )) { letter(); }
else { something_else();
} } print "Písmena: $letter, jiné znaky: $something_else";
PHP 5 – moduly, rozšíření a akcelerátory
279
xdebug_dump_function_trace();
Obrázek 12-1. Výstup z výpisu 12-1 zahrnuje i sledování volání funkcí.
Jak vidíte na obrázku 12-1, je výstup funkce xdebug_dump_function_trace() tabulka HTML s jedním řádkem pro každé volání funkce. Tabulka ukazuje uplynulý čas, okamžik, kdy se daná funkce zavolala, dále úroveň vnoření volání funkce (všechny funkce z výpisu 12-1 se volají na nejvyšší úrovni), název funkce, a název souboru a číslo řádku s voláním funkce. Sledování volání ukazuje, že se funkce preg_match() zavolala jednou pro každý znak hodnoty $phrase, a pak se volala buď letter(), nebo something_else() v závislosti na tom, zda byl daný znak písmeno, nebo něco jiného.
280
Kapitola 12 – Profilování a ladění s Xdebug
Xdebug také můžete říct, aby sledoval i parametry funkcí, když zapnete konfigurační nastavení xdebug.collect_params. Obrázek 12-2 ukazuje výstup z výpisu 12-1 s aktivovaným parametrem xdebug.collect_params.
Obrázek 12-2. Sledování volání funkcí a jejich parametrů.
Xdebug umí také protokolovat volání funkcí do souboru. Předejte do xdebug_start_trace() název souboru a sledování funkčních volání se bude zapisovat do tohoto souboru. Jestliže už zadaný soubor existuje, připojí Xdebug informace o sledování na konec souboru. Kromě toho vrací funkce xdebug_get_function_trace() pole obsahující informace o aktuálním sledování funkcí. Zatímco xdebug_dump_function_trace() informace o sledování vytiskne, poskytuje xdebug_get_function_trace() data ve formátu příhodném pro další manipulace. Každý prvek pole, které vrací funkce xdebug_get_function_trace(), je asociativní pole. Prvky nacházející se v těchto asociativních polích jsou popsané v tabulce 12-1.
PHP 5 – moduly, rozšíření a akcelerátory
281
Tabulka 12-1. Informace, které vrací xdebug_get_function_trace(). Klíč
Hodnota
Přítomna vždy?
function
Název funkce.
Ano
file
Úplná cesta k souboru, ze kterého se funkce zavolala.
Ano
line
Řádek, ze kterého se funkce v souboru zavolala.
Ano
time_index
Doba (v sekundách) od začátku běhu skriptu, kdy se funkce zavolala.
Ano
params
Pole argumentů funkce.
Jen když je zapnutý parametr xdebug.collect_params.
memory_usage
Množství paměti (v bajtech), které používal skript,
když se funkce volala.
Jen když je PHP zkompilovaný s --enable-memory-limit.
Ve výpisu 12-2 se pomocí xdebug_get_function_trace() vyprodukuje zpráva o tom, kolikrát se jednotlivé funkce volaly. Výpis 12-2. Počty funkčních volání. xdebug_start_trace(); function letter() {
$GLOBALS['letter']++; }
function something_else() {
$GLOBALS['something_else']++; }
$phrase = "Is 5 OK?"; for ($i = 0, $j = strlen($phrase); $i < $j; $i++) { if (preg_match('/[[:alpha:]]/', $phrase{ $i} )) { letter(); }
else { something_else();
} } print "Letters: $letter, Other: $something_else\ n"; $trace = xdebug_get_function_trace(); $functions_called = array(); // Zjistí počty volání jednotlivých funkcí foreach ($trace as $function_call) { $functions_called[$function_call['function']]++; } // Zobrazí výsledky foreach ($functions_called as $function => $count) { print "Funkce $function() se volala $count krát.\ n"; }
Kapitola 12 – Profilování a ladění s Xdebug
282
Výpis 12-2 vytiskne tohle: Písmena: 4, jiné znaky: 4 Funkce strlen() se volala 1 krát. Funkce preg_match() se volala 8 krát. Funkce letter() se volala 4 krát. Funkce something_else() se volala 4 krát.
Výsledkem sledování funkčních volání, který zobrazí xdebug_dump_function_trace(), nebo vrátí xdebug_get_function_trace(), je seznam všech funkčních volání ve skriptu až do tohoto okamžiku. Xdebug ale umí také vyprodukovat zásobník funkčních volání, což je seznam funkcí, které byly zavolány, ale jejich práce ještě neskončila. Výpis 12-3 volá xdebug_get_function_stack(), protože chce vyprodukovat zásobník funkčních volání uvnitř své funkce show_output()3. Výpis 12-3. Zobrazení zásobníku funkčních volání. function check_input($var_name) { $len = strlen($GLOBALS[$var_name]); if (($len > 0) && ($len < 13)) { return true; }
else { return false;
} } function show_output($var_name) { print "$var_name --> " . $GLOBALS[$var_name] . "\ n"; $stack = xdebug_get_function_stack(); print_r($stack); } function process_vars() { $vars = array('name'); foreach ($vars as $var) { if (check_input($var)) { show_output($var); } } } $name = 'Ireneo Funes'; process_vars();
Výpis 12-3 vytiskne tohle: name --> Ireneo Funes Array (
PHP 5 – moduly, rozšíření a akcelerátory
283
[0] => Array ( [function] => { main} [file] => /books/php-gems/listing-12-3.php [line] => 0 [params] => Array ( ) ) [1] => Array ( [function] => process_vars [file] => /books/php-gems/listing-12-3.php [line] => 23 [params] => Array ( ) ) [2] => Array ( [function] => show_output [file] => /books/php-gems/listing-12-3.php [line] => 18 [params] => Array ( ) )
Každý prvek pole, které vrátí xdebug_get_function_stack(), reprezentuje v zásobníku funkčních volání jednu úroveň. První prvek, který má funkci nastavenou na {main}, zastupuje nejvyšší úroveň programu, vně všech funkcí. Každý následný prvek pole odpovídá nějakému funkčnímu volání. Druhý prvek pole říká, že se na řádku 23 souboru zavolala funkce process_vars(), třetí prvek říká, že show_output() se zavolala na řádku 18 souboru. Podpole params jsou prázdná, jestliže je vypnutý konfigurační parametr xdebug.collect_params. Funkce function_stack() respektuje nastavení collect_params právě tak, jako funkce xdebug_get_function_trace(). Když ve vašem programu dojde k nějaké chybě, často pomůže, když se podíváte do zásobníku volání funkcí. Místo pouhé zprávy o tom, na kterém řádku došlo k chybě, uvidíte, jaké funkce volaly které těsně předtím, než došlo k chybě. Xdebug zobrazuje standardně zásobník volání funkcí, dojde-li k nějaké chybě4. Podívejte se například na výpis 12-4, který obsahuje téměř stejný kód jako výpis 12-3. Ve výpisu 12-4 ale funkce show_output() nevolá xdebug_get_function_stack(), ale nesprávně použije strcmp(). Obrázek 12-3 ukazuje, jak bude vypadat zásobník volání Xdebug v kontextu této chyby.
Kapitola 12 – Profilování a ladění s Xdebug
284
Výpis 12-4. Nesprávné použití strcmp() uvnitř show_output(). function check_input($var_name) { $len = strlen($GLOBALS[$var_name]); if (($len > 0) && ($len < 13)) { return true; }
else { return false;
} } function show_output($var_name) { print "$var_name --> " . $GLOBALS[$var_name] . "\ n"; if (strcmp($var_name)) { print "Good name."; } } function process_vars() { $vars = array('name'); foreach ($vars as $var) { if (check_input($var)) { show_output($var); } } } $name = 'Ireneo Funes'; process_vars();
Obrázek 12-3. Zobrazení zásobníku volání, když dojde k chybě.
Nepřejete-li si, aby Xdebug při chybě zobrazoval zásobník volání, nastavte konfigurační nastavení xdebug.default_enable na off, nebo zavolejte ze svého kódu xdebug_disable(). Každá z těchto akcí obnoví standardní formát zobrazování chyb PHP.
PHP 5 – moduly, rozšíření a akcelerátory
285
Profily funkcí Profily funkcí v Xdebug poskytují zprávy o tom, kde vaše programy PHP tráví při běhu svůj čas. To umožňuje vyhledat ty části kódu, které jsou pomalé, a je proto třeba je zdokonalit. Profil funkce vám řekne nejen to, jak dlouho trvalo volání nějaké funkce, ale i kolikrát se funkce volala. Podívejte se na program, který volá třicetkrát funkci match_strings() (jejíž běh trvá 0.1 sekundy), a pouze jednou funkci parse_input() (jejíž běh trvá 2 sekundy). Pokud by se vám povedlo předělat match_ strings() tak, aby byla dvakrát rychlejší, takže byste dobu jejího běhu zkrátili na 0.05 sekundy, byl by program o 1.5 sekundy rychlejší. Pokud byste zvýšili dvojnásobně rychlost funkce parse_input(), zkrátili byste běh programu jen o jednu sekundu. Když si uděláte profily funkcí, budete se moci soustředit při zdokonalování kódu na ta místa, která vám přinesou největší zisky co se týče celkového zkrácení doby běhu programu, protože se bere v úvahu četnost volání jednotlivých funkcí. Profilování funkcí odstartujete tak, že zavoláte xdebug_start_profiling(). Tím říkáte Xdebug, aby začal shromažďovat statistiky o vašem programu. Chcete-li si prohlédnout informace o profilech funkcí, zavolejte na konci svého programu xdebug_dump_function_profile(). Výpis 12-5 vytiskne data z databázové tabulky, pak zobrazí profily funkcí. Výstup z programu ve výpisu 12-5 vidíte na obrázku 12-4. Výpis 12-5. Tisk dat z databáze a zpráva o profilech funkcí. xdebug_start_profiling(); $dbh = mysql_connect('localhost','phpgems','phpgems1'); mysql_select_db('phpgems'); $res = mysql_query('SELECT * FROM ice_cream'); while ($ob = mysql_fetch_object($res)) { print_flavor($ob); } function print_flavor($ob) { printf("%s (%d calories): $%.2f<br>", $ob->flavor, $ob->calories, $ob->price); } xdebug_dump_function_profile();
286
Kapitola 12 – Profilování a ladění s Xdebug
Obrázek 12-4. Zpráva o profilech funkcí.
Zpráva o profilech na obrázku 12-4 obsahuje seznam všech volaných funkcí, kolik času program strávil v jednotlivých funkcích, kolikrát se jednotlivé funkce volaly, a zdrojový soubor a číslo řádku, odkud se funkce volaly. Hvězdička vedle print_flavor() indikuje, že se jedná o uživatelsky definovanou funkci. Za seznamem volání funkcí obsahuje zpráva o profilech jisté časové údaje, které se vztahují ke skriptu jako k celku. Položka Opcode Compiling je doba strávená kompilací zdrojového skriptu do operačních kódů Zend Engine. To je doba, kterou byste ušetřili, kdybyste kód ukládali do cache. (Další informace o používání code cache viz kapitola 13.) Položka Function Execution je doba strávená vykonáváním funkcí v hlavním skriptu PHP nebo v kódu ve vložených souborech. Položka Ambient Code Execution je doba strávená vykonáváním toho kódu v hlavním skriptu PHP, který se nachází vně všech funkčních volání. Položka Total Execution je součet položek Function Execution a Ambient Code Execution, konečně položka Total Processing je součet položek Opcode Compiling a Total Execution. Standardně funkce xdebug_dump_function_profile() zobrazuje informace seřazené podle čísel řádků skriptu, můžete jí ale předat argument, chcete-li výstup uspořádat jinak. Režimy, které xdebug_ dump_function_profile() akceptuje, jsou uvedené v tabulce 12-2.